Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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++ C+中的继承+;;类数据也是继承的吗?_C++_Inheritance - Fatal编程技术网

C++ C+中的继承+;;类数据也是继承的吗?

C++ C+中的继承+;;类数据也是继承的吗?,c++,inheritance,C++,Inheritance,因此,如果父类Base中有一个函数greet,它是虚拟的 父类中有一个名为name的属性 现在名为Child的类继承了它,并且greet没有实现,但是name属性在Child类中发生了更改。因此,当调用Child.greet()时,它是使用孩子的名称还是使用父母的名称 非常感谢对设计决策原因的解释。它在调用时使用name的值。如果孩子在调用greet之前设置了名称,那么它将使用孩子设置的值。如果孩子在通话后将姓名设置为问候语,则会使用默认值或通话前设置的任何内容。您是否尝试查看?这个打印“hel

因此,如果父类
Base
中有一个函数
greet
,它是虚拟的

父类中有一个名为
name
的属性

现在名为
Child
的类继承了它,并且
greet
没有实现,但是
name
属性在
Child
类中发生了更改。因此,当调用
Child.greet()
时,它是使用孩子的
名称
还是使用父母的
名称


非常感谢对设计决策原因的解释。

它在调用时使用
name
的值。如果孩子在调用
greet
之前设置了名称,那么它将使用孩子设置的值。如果孩子在通话后将姓名设置为问候语,则会使用默认值或通话前设置的任何内容。

您是否尝试查看?这个打印“hello Base”。因为您调用BASE的GRUTER()方法(没有其他),它将访问BASIC的名称成员变量(通常在C++成员变量中不称为“属性”)。希望我理解你的问题

#include <iostream>
using namespace std;

class Base
{
    string name;

public:
    Base() : name(" Base") { }

    virtual string greet()
    {
        return string("hello") + name;
    }
};

class Child : public Base
{
    // bad practice, hiding Base's name member by doing this
    string name;

public:
    Child() : name(" Child") { }
};

int main() {

    Child* child = new Child;
    // prints "hello Base"
    cout << child->greet();
    delete child;

    // same result if calling through a Base pointer (or reference)
    Base* base = new Base;
    // prints "hello Base"
    cout << base->greet();
    delete base;

    return 0;
}
#包括
使用名称空间std;
阶级基础
{
字符串名;
公众:
Base():名称(“Base”){}
虚拟字符串
{
返回字符串(“hello”)+名称;
}
};
类子:公共基
{
//不好的做法,通过这样做隐藏基地成员的名字
字符串名;
公众:
Child():名称(“Child”){}
};
int main(){
孩子*孩子=新孩子;
//打印“你好基地”
不能打招呼();
删除儿童;
//如果通过基指针(或引用)调用,则结果相同
基地*基地=新基地;
//打印“你好基地”
不能打招呼();
删除基数;
返回0;
}

[我编辑了这个问题以澄清格式。]

这里有两种可能的情况

  • 如果
    name
    属性是私有的,并在
    Child
    中重新定义,则有两个单独的变量,每个变量都有自己的值。
    greet
    方法只能看到自己的方法。这就是目的吗

  • 如果未重新定义
    名称
    属性,则只有一个属性和一个值。
    greet
    方法返回该值


  • 无论哪种方法,答案都是一样的:
    greet
    方法返回
    Base
    中的值。属性没有虚拟化。只有方法可以被虚拟化。

    你不能改变C++中派生类中成员的名字。我想你是说属性<代码>值<代码>已经改变了吗?无法更改属性名称。说明:
    name
    是一个成员变量。它包含一个
    。你说的属性是什么意思?这是危险的,应该避免,你用
    Child::name
    隐藏了
    Base::name
    ,这造成了很多混乱。