C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
2013-09-28 11:42
761 查看
看下面这个例子:
class A
{
protected:
A(){}
~A(){}
public:
virtual void print()
{
cout<<"A::print()!"<<endl;
}
};
class B:public A
{
public:
B(){}
~B(){}
private:
virtual void print()
{
cout<<"B::print()!"<<endl;
}
};
int main()
{
//A obj;//ERROR
B d;
A *pB = &d;
pB->print();
return 0;
}
最后输出"B::print()!",调用的是派生类B中的私有成员函数
print是一个虚函数,pB指向都内容是Derived,所以 pB->print() 调用的是Derivied::print()。
至于private的问题,因为pB是指向Base的指针,调用Base的private函数是可以的(只不过Base::print()那个虚函数指针的内容是 Derivied::print())???这句话没看懂,实在不知道为什么会这样???
class A
{
protected:
A(){}
~A(){}
public:
virtual void print()
{
cout<<"A::print()!"<<endl;
}
};
class B:public A
{
public:
B(){}
~B(){}
private:
virtual void print()
{
cout<<"B::print()!"<<endl;
}
};
int main()
{
//A obj;//ERROR
B d;
A *pB = &d;
pB->print();
return 0;
}
最后输出"B::print()!",调用的是派生类B中的私有成员函数
print是一个虚函数,pB指向都内容是Derived,所以 pB->print() 调用的是Derivied::print()。
至于private的问题,因为pB是指向Base的指针,调用Base的private函数是可以的(只不过Base::print()那个虚函数指针的内容是 Derivied::print())???这句话没看懂,实在不知道为什么会这样???
相关文章推荐
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- C++中通过派生类调用第二基类的普通成员函数时this指针的调整
- 多态继承情况下,有一个基类指针指向派生类对象,如何用它调用基类的虚函数?
- C++中类的访问权限针对的是类而不是对象!(为什么类中的函数可以访问对象的私有成员?)
- 【C++】基类指针可以指向派生类对象,派生类指针不可以指向基类对象
- 为什么基类指针和引用可以指向派生类对象,但是反过来不行?
- C++中vritual虚函数漏洞,通过指针(利用虚表,调用函数)任然可以访问到基类中虚函数。
- C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765
- 详解this指针--为什么空的对象指针可以调用成员函数
- c++中非静态函数不能用类名调用,为什么CWnd的成员函数GetDC()可以直接调用啊?
- 为什么通过空指针(NULL)可以正确调用类的部分成员函数
- 为什么基类指针和引用可以指向派生类对象,但是反过来不行?
- 为什么基类指针(或引用)可以调用派生类的private虚函数
- C++入门学习:虚析构、构造中不能实现多态、基类指针指向派生类数组的弊端
- 浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?
- 为什么基类指针可以指向派生类对象,而派生类则不可以指向基类
- OJ——指向基类的指针访问派生类的成员函数
- 为什么通过空指针(NULL)可以正确调用一些类的成员函数?
- 为什么基类指针和引用可以指向派生类对象,但是反过来不行?
- C++如何在派生类成员函数内调用基类的成员函数(包括构造函数)