请问,C++中为什么指向子类的基类指针不能调用子类自己的函数
用指向子类的基类指针调用子类的函数,只能是虚函数。如果你要调用子类的非虚函数,必须先将基类指针转换为子类的指针,然后再调用。
简单说这是语法规定。而且是符合逻辑的
你想如果你写了一个类,别人使用它,并且继承于他,并添加一些方法,那么你写这个类的时候,如果不事先沟通你怎么能够知道别人添加的什么方法?
如果还不明白,比如你的写了一个类库并开源,全世界有数千名使用者,每个人都继承了你写的类,并扩展了你的类,你怎么知道他们都给那个继承你的类的类添加了什么方法?
第二点,你要知道c++编译完以后不具备类型信息和c#,java不同,也就是说生成二进制文件以后不再有这些类的信息。虚函数是通过一个虚表来确定,而非虚函数,必须是编译时期确定函数的入口地址。
所以当一个基类指针调用非虚函数时候,编译期间必须要确定那个函数的地址,而在编译期是做不到的
比如
class a{};
class b:a{
void f();
};
class c:a{
void f();
};
a* func(){
int n;
cin>>n;
if(n%2==0)
reutrn new b;
else
return new c;
}
a* t=func();
a->func();//你知道返回哪个类型吗?
c++ 访问属性是通过 对象地址(this)找到的,指向子类的基类指针传递的是子类对象的 地址(this)所以能找到子类的属性,而 访问方法是通过类型来访问的,与对象地址无关 ,指向子类的基类指针的类型是基类的类型,所以只能访问基类方法。