如果 B
使用 public
从 A
继承,可以 B
覆盖其中一个函数并强制它私密吗?
class A
{
public:
virtual double my_func1(int i);
virtual double my_func2(int i);
}
class B : public A // Notice the public inheritance
{
public:
virtual double my_func1(int i);
private:
virtual double my_func2(int i);
}
反过来呢?如果继承类型是私有(private)的 - B
可以强制一个特定的函数是公共(public)的吗?
如果 A
是纯抽象的怎么办?有区别吗?
protected
在任何组合中都会有什么不同吗?
最佳答案
如果 B 使用 public 从 A 继承,B 是否可以覆盖其中一个函数并强制它为私有(private)? 没有
尽管 my_func1()
是在 privte
访问说明符下声明的,它仍然可以通过指向 class A
的指针调用,实际上指向class B
的对象
对 my_func1()
的调用在运行时根据指针指向的对象类型进行评估。在编译时,编译将 my_func1()
调用视为对 A::my_func1()
的调用,并且由于 A::my_func1()
是public 编译器不会只报告错误。只有在运行时才会评估实际的函数调用 B::my_func1()
。
当然,您不能通过 class B
的对象直接调用 my_func1()
,因为 B::my_func1()
是在 Private 下声明的访问说明符并且您不能从类外部访问私有(private)声明的成员。
反过来呢?如果继承类型是私有(private)的 - B 可以强制一个特定的函数公开吗?
没有
如果您通过基类 class A
的指针调用 my_func1()
,则在编译时它只是被评估为对 A::my_func1 的调用()
这是 Invalid
因为 A::my_func1() 在
class A`
如果 A 是纯抽象的呢?有区别吗?
没有
基类是抽象的还是多态的都没有区别。将适用相同的规则。
在任何组合中 protected 会产生什么不同吗?
没有
正如前 2 个 Q 中所解释的,如果您正在调用一个完全指向基类的虚函数,那么在编译时编译器只检查基类中该成员函数的访问,因为编译器将其视为对基类成员函数的调用。对函数的实际调用在 runtime
进行评估,该功能称为 Runtime Polymorphism
或 Dynamic polymorphism
独立于访问说明符,作为编译时构造。
总之,
覆盖基类的成员不会影响访问
关于C++:覆盖公共(public)\私有(private)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5753833/