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说明符无关,后者作为编译时构造.
所以最后,
覆盖基类的成员不会影响访问
如果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(),因此代码甚至不会编译!
| 归档时间: |
|
| 查看次数: |
9868 次 |
| 最近记录: |