Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 继承的函数将读取父类或子类的数据成员? 在func中调用foo时,foo会设置a::var还是B::var? 在对func中的bar的调用中,bar将读取A::var还是B::var? 如果不会创建实例,是否需要将var声明为中的数据成员? 类声明A2和B2的工作效果是否与A和B相同?_C++_Inheritance_Virtual Functions - Fatal编程技术网

C++ 继承的函数将读取父类或子类的数据成员? 在func中调用foo时,foo会设置a::var还是B::var? 在对func中的bar的调用中,bar将读取A::var还是B::var? 如果不会创建实例,是否需要将var声明为中的数据成员? 类声明A2和B2的工作效果是否与A和B相同?

C++ 继承的函数将读取父类或子类的数据成员? 在func中调用foo时,foo会设置a::var还是B::var? 在对func中的bar的调用中,bar将读取A::var还是B::var? 如果不会创建实例,是否需要将var声明为中的数据成员? 类声明A2和B2的工作效果是否与A和B相同?,c++,inheritance,virtual-functions,C++,Inheritance,Virtual Functions,在您修复了注释中提到的私有问题,并为A::foo提供了一个实现以避免未定义的vtable错误之后,您将看到您正在调用B::foo,它只保留A::var,而bar打印出A::var 在派生类中使用相同的变量名是相当愚蠢的,但我将记住这一点,以满足未来的混淆需求 A2和B2看起来不那么超现实 在func中调用foo时,foo会设置a::var还是B::var foo将设置B::var 在对func中的bar的调用中,bar将读取A::var还是B::var func中的bar将返回一个::var,该

在您修复了注释中提到的私有问题,并为A::foo提供了一个实现以避免未定义的vtable错误之后,您将看到您正在调用B::foo,它只保留A::var,而bar打印出A::var

在派生类中使用相同的变量名是相当愚蠢的,但我将记住这一点,以满足未来的混淆需求

A2和B2看起来不那么超现实

在func中调用foo时,foo会设置a::var还是B::var

foo将设置B::var

在对func中的bar的调用中,bar将读取A::var还是B::var

func中的bar将返回一个::var,该值为零或未定义

如果没有实例,是否需要将var声明为中的数据成员 会不会被创造出来

是的,因为返回变量的是void A::bar

类声明A2和B2的工作效果是否与和相同 B


否,A2::bar和B2::bar将返回相同的var 42。

关于1。二,。出现错误,因为foo不可见,而A::foo没有正文:

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();
};
无论如何,因为您不是通过指针/引用调用它

class B : public A{
    int var;
    void foo();
};
关于3。四,。如果基类和派生类都有一个同名的变量,则派生类隐藏基类的名称,并且通过派生对象进行的每次访问都将导致设置/调用派生类,除非显式执行base::var。如果只有一个变量,则可以,只要该变量可见/可访问,它们都将调用相同的版本。在您上面的示例中:

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
}
查看并研究以下内容:

在func中调用foo时,foo会设置a::var还是B::var? foo是虚拟的,myObj的动态和静态类型是B,因此将调用B::foo,设置B::var

请注意,在这种情况下,虚拟机没有任何效果,因为您没有使用多态性

在对func中的bar的调用中,bar将读取A::var还是B::var? 它将读取一个::var

如果不会创建实例,是否需要将var声明为中的数据成员? 我认为,您需要将A::bar设置为虚拟的,或者让B::foo在某个时候调用A::foo来设置基本成员变量

类声明A2和B2的工作效果是否与A和B相同?
您希望它们在哪些方面有所不同?

您是否尝试过简单地运行代码来找出不同之处?在我看来,你似乎可以跑过去试试这个?我想知道为什么有些东西能工作,而有些东西不能。当然我也会运行它。func不会编译:myObj.foo是私有的。抱歉,修复了这个问题@Aschepperler你能详细说明A2和B2吗?@tMJ我刚刚做了,看看我附上的例子。它应该解释发生了什么。谢谢,让它更清楚!不过我还有一个问题,我可以在父类中声明一个方法吗?我确信不会创建父类的任何实例,也不会在子类中定义它。这种技术叫什么?@tMJ除非您将基类方法标记为这意味着每个派生类都必须实现它,否则您还需要在基类中定义它。
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
}
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();
}