gpt4 book ai didi

c++ - C++继承中名字隐藏的优先级

转载 作者:行者123 更新时间:2023-11-27 22:36:00 29 4
gpt4 key购买 nike

为什么从指向基类(A 类)的指针调用 print() 有效,而从子类对象(C 类)调用 print() 无效?

声明 1:将给出“print A”作为输出,因为 A::print() 是一个虚拟的function 它将调用继承自 A::print() 的类 C 的 print() 函数。这样就可以证明C类确实有print()函数

声明 2:这将给出编译器错误,因为 B::print(int x) 将隐藏 A::打印()。

声明三:会报编译错误。为什么?

可能是因为 print() 仍然隐藏在 C 类中,因为 C 类也继承了 B::print(int x)。如果是这种情况,那么为什么从 a->print() 调用有效?

另一个问题:是否有任何规则规定 B::print(int x) 将在子类中隐藏 A::print()?

class A{
public:
virtual void print();
};

void A::print(){
cout<<"print A\n";
}

class B:public A{
public:
void print(int x);
};

void B::print(int x){
cout<<"print B " << x <<"\n";
}

class C:public B{
};

void funca(A *a){
a->print();//Statement 1
}

void funcb(B *b){
//b->print(); Statement 2
}

void funcc(C *c){
//c->print(); Statement 3
}

int main(){

C d;
funca(&d);
funcb(&d);
funcc(&d);
}

最佳答案

Probably because print() is still hidden in Class C as Class C is also inheriting B::print(int x). If this is the case then why call from a->print() worked?

A 是基类,所以没有什么可隐藏的,a->print() 只是在基类上下文中工作。

BC 都使用不同的原型(prototype) print(int) 隐藏了原始的 print() 函数因此错误是因为使用错误的原型(prototype)调用函数(BC 类中不再有 print())

关于c++ - C++继承中名字隐藏的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54072453/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com