C++:重写public\private继承

Jon*_*han 17 c++ inheritance private public

如果B继承自A使用public,可以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);
}
Run Code Online (Sandbox Code Playgroud)

反过来怎么样?如果继承类型是私有的 - 可以B强制特定的函数是公共的吗?

如果A是纯抽象怎么办?这有什么不同吗?

protected做的任意组合有什么区别?

Alo*_*ave 15

如果B继承自A使用public,B可以覆盖其中一个函数并强制它为私有吗? 没有

虽然my_func1()priavte访问说明符下声明它仍然可以通过指向class A实际指向的对象来调用class B

my_func1()在运行时评估调用,具体取决于指针指向的对象类型.在编译时,编译将my_func1()调用视为调用A::my_func1(),因为A::my_func1()是公共编译器不报告错误.只有在运行时B::my_func1()才会评估实际的函数调用.

当然,你不能直接my_func1()通过对象调用,class B因为B::my_func1()在私有访问说明符下声明,你不能从类外访问私有声明的成员.

反过来怎么样?如果继承类型是私有的 - B可以强制将特定函数公开吗?
没有

如果你正在呼吁my_func1()通过基础的指针class A,在编译的时候它只是评价为呼叫A::my_func1()这是Invalid因为A::my_func1() is declared private in类A`

如果A是纯抽象怎么办?这有什么不同吗?
NO
这没有什么区别,如果基类是抽象或只是多态性.相同的规则将适用.

受保护会在任何组合中产生任何差异吗?

如前两个Q中所述,如果您通过指向Base类的指针调用虚函数,则在编译时编译器仅检查Base类中该成员函数的访问权限,因为编译器将其视为对Base类成员函数的调用.对函数的实际调用在at处进行计算,run time并且调用该函数Runtime Polymorphism或者Dynamic polymorphism与Access说明符无关,后者作为编译时构造.

所以最后,

覆盖基类的成员不会影响访问

  • 虽然我选择了这个作为答案,但我建议阅读其他答案以获得更多细微之处 (3认同)

Naw*_*waz 6

区别

如果A是纯抽象怎么办?这有什么不同吗?

它唯一的区别是以下,即它们如何(或不能)使用:

A *pa = new B();
pa->my_func2(10); //calls B::my_func2() even though its private!

B *pb = new B();
pb->my_func2(10); //compilation error - trying to access private function
Run Code Online (Sandbox Code Playgroud)

说明

Access-specifiers是编译时构造,因此,编译器会在编译时(显然)根据对象(或指针)的静态类型检测到任何违反访问规则的行为.在运行时无法检测到此类违规.

因此pa->my_func2()工作,因为编译器看到静态类型pa是定义A*了公共函数my_func2(),所以表达式pa->my_func2()传递编译器的测试.因此它有效.

但是pb->my_func2()不起作用,因为静态类型的pb就是B*它有一个私有函数my_func2(),因此代码甚至不会编译!