如果父类和子类都有相同的方法,参数个数不同,将子类对象赋给父类后,由于子类继承于父类,所以使用父类指针 调用父类方法时,实际调用的是子类的方法
选项全部都不正确
重载和多态在C++面向对象编程中经常用到的方法,都只在实现子类的方法时才会使用
class A{ void test(float a){cout<<"1";} }; class B:public A{ void test(int b){cout<<"2";} }; A *a=new A; B *b=new B; a=b; a.test(1.1); 结果是1
D选项,首先两个test函数都是private的(class默认访问级别为private),无法通过a来访问
a是一个指针,应该使用a->test(1, 1);
。如果改成下面那样,那答案就是对的:
class A{ public: void test(float a) {cout<<"1";} }; class B : public A { public: void test(int b) {cout<<"2";} }; int main() { A* a = new A; B* b = new B; a = b; a->test(1.1); // 输出1 return 0; }
不管a实际指向的对象是谁,因为test并不是virtaul函数,并不展现出多态性,在编译时期就能决定调用哪个test,因此输出1
就算加上了virtual,答案也还是1,因为B中test函数的形参为int,而A中的形参为float,这并不满足多态的要求,依然是在编译时期就能决定调用哪个test,并且在B中A的test函数被隐藏了
<details><summary>重写/重载/隐藏的区别(点击展开)</summary>重写(覆盖):是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰。 隐藏:是指派生类的函数屏蔽了与其同名的基类函数,注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。 重载:是指同一可访问区内被声明的几个具有不同参数列表(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型</details>
除非改成这样,才会输出2:
class A{ public: virtual void test(float a) {cout<<"1";} }; class B : public A { public: void test(float b) {cout<<"2";} }; int main() { A* a = new A; B* b = new B; a = b; a->test(1.1); // 输出2 return 0; }
这时候a指向对象b,展现多态,调用了class B中的test,因此输出2