c++ - 子类会影响虚拟方法的可见性吗?

标签 c++ inheritance access-modifiers class-visibility

假设我有拳头课

class Walker {
public:
   Walker();
   virtual ~Walker();
   virtual void Step();
};

然后是第二个,从前一个派生

class Mecha : public Walker {
public:
   Mecha();
   virtual ~Mecha();
private:
   virtual void Step();
};

Step() 上的 private 修饰符有用吗? Mecha::Step() 仍然可以称为 Walker::Step(),不是吗?当我试图通过其子类的定义来改变父类(super class)的性质时,不应该有警告吗?

最佳答案

Can a sub-class affect visibility of virtual methods?

是的,他们可以改变方法的可见性。

Is that private modifier on Step() useful?

视情况而定。它主要影响代码的客户端。

增加可见性(例如,从 protectedpublic)可能有用,但在使用时会发出警告 - 基类接口(interface)的实现者希望方法在层次结构内部,使其在外部可能会破坏事情...(想到 template method pattern 的可能实现)。

原则上,更改可见性不会影响 virtual 方法的多态性 - 它仍然在派生类中被覆盖。但是,它确实会影响调用者。将方法更改为 private 会将客户端代码限制为从指针或对基类的引用而不是派生类调用方法。

Mecha m;
//m.Step(); // fails to compile
Walker& w = m;
w.Step(); // still calls Mecha::Step()

此外,将方法更改为 protected 将允许更多的子类调用它。

关于c++ - 子类会影响虚拟方法的可见性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38916858/

相关文章:

c++ - C++ 中的继承成员函数如何处理子成员变量?

java - 在继承类中使用私有(private)变量 - Java

c++ - 如何识别部分模板特化

c++ - 在 C++ 中将代码分解为几个小函数有什么好处?

c++ - 为什么要无限循环

java - 有没有办法在匿名类中初始化最终字段?

c# - 继承类、泛型构造函数有问题

java - 实例化对象时编译错误

c# - .NET 中的 protected 类

c++ - "unsigned int"是否被视为一种数据类型?