1.多态类中的虚函数表是 Compile-Time,还是 Run-Time 时建立的?
答案:虚拟函数表是在编译期就建立了各个虚拟函数这时被组织成了一个虚拟函数的入口
地址的数组而对象的隐藏成员虚拟函数表指针是在运行期也就是构造函数被调用时进
行初始化的这是实现多态的关键
4.一个父类写了一个 virtual 函数,如果子类覆盖它的函数不加 virtual ,也能实现多态?
在子类的空间里,有没有父类的这个函数,或者父类的私有变量? (华为笔试题)
答案:只要基类在定义成员函数时已经声明了 virtue 关键字,在派生类实现的时候覆盖该函数时, virtue
关键字可加可不加,不影响多态的实现。子类的空间里有父类的所有变量(static 除外)。
)类 从 派生,那么 试问该表达是否合
法?为什
么?
答案:派生类的指针指向基类的对象是错误的,不能通过编译的; 基类的指针可以指向派生类的对象,
调用派生类的函数
鸡是动物,没错。( 动物的指针 指向 鸡的实例)
鸡可以执行所有动物都具有的方法,例如 “死亡”
反过来,动物一定是鸡吗?(鸡的指针 指向 动物或者动物的某个派生类的实例)
动物都能执行鸡的某个方法吗?比如说 “下蛋”?
)如果 中定义并实现虚函数 , 中也实现该函数,那么上
述变量
将调用哪个类里面的函数?如果 不是虚函数,情况又如何?为
什
么?
答案:第一问调用的是 的。第二问调用 的。
虚函数的一个典型应用,虚函数只能借助于指针或者引用来达到多态的效果
如果没有定义成虚函数:
class A{
public:
void print(){ cout<<”This is A”<<endl;}
};
class B:public A{
public:
void print(){ cout<<”This is B”<<endl;}
};
int main(){ //为了在以后便于区分,我这段 main()代码叫做 main1
A a; B b;
A* p1=&a;
A* p2=&b;
p1->print();
p2->print();
}
结果是两个 This is A