如果父类和子类都有相同的方法,参数个数不同,将子类对象赋给父类后,由于子类继承于父类,所以使用父类指针 调用父类方法时,实际调用的是子类的方法
选项全部都不正确
重载和多态在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