gpt4 book ai didi

c++ - 继承函数会读取父类还是子类的数据成员?

转载 作者:搜寻专家 更新时间:2023-10-31 01:02:49 24 4
gpt4 key购买 nike

class A{
int var;
public:
virtual void foo(); // sets var
void bar(); // reads var and displays value
};

class B : public A{
int var;
public:
void foo();
};

void A::bar(){
printf("%d",var);
}

void B::foo(){
var = 42;
}

void func(){
B myObj;
myObj.foo();
myObj.bar();
}

class A2{
virtual void foo(); // sets var
public:
int var;
void bar(); // read var and displays value
};

class B2 : public A2{
public:
void foo();
};
  1. 调用 foofunc will foo set A::varB::var
  2. 并调用barfuncbar阅读 A::varB::var
  3. 我需要申报吗var作为 A 中的数据成员如果没有 A 的实例会被创造出来吗?
  4. 请问类声明A2B2效果与 A 相同和 B

最佳答案

关于 1. 和 2. 由于 foo 不可见(并且 A::foo 没有主体)而出现错误:

class B : public A{
int var;
void foo();
};

无论如何,因为你不是通过指针/引用调用它

void func(){
B myObj;
myObj.foo(); // No polymorphic behavior here, B::foo is called
myObj.bar(); // the same, but A::bar is called since B hasn't one
}

关于 3. 和 4. 如果基类和派生类都有同名变量,则派生类的变量会隐藏基类的名称,并且通过派生对象的每次访问都将导致派生类被设置/调用(除非显式执行 base::var)。如果只有一个有它,那很好,它们都会调用相同的版本(前提是它可见/可访问)。在你上面的例子中:

void A::bar(){
std::cout << var; // This will output an uninitialized A::var!
}

void B::foo(){
var = 42; // B's var hides A's var so this only sets the derived one's
}

编辑:在 A2B2 的情况下,只有一个 A2::var 实例以及对它的每次访问,即使是来自一个派生类,将引用基类,例如

class A2{
virtual void foo() = 0;
public:
int var;
void bar() {
std::cout << var; // Will correctly output 42
}
};

class B2 : public A2{
public:
void foo() {
var = 42; // Sets the common A2::var variable
};
};

void func2(){
B2 myObj;
myObj.foo();
myObj.bar();
}

查看并研究以下内容: Example

关于c++ - 继承函数会读取父类还是子类的数据成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26467594/

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