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

时间:2014-03-24 00:12:37

标签: c++ inheritance

因此,如果父类greet中存在函数Base并且它是虚拟的。

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

现在名为Child的类继承了它,greet未实现,但name类中的属性Child已更改。因此,在致电Child.greet()时,它会使用孩子的name还是家长的name

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

3 个答案:

答案 0 :(得分:1)

它在调用时使用name的值。如果孩子在调用greet之前设置了名称,那么它将使用孩子设置的值。如果孩子在调用greet后设置了名称,那么它将使用默认值或呼叫前设置的任何值。

答案 1 :(得分:1)

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

这里有两种可能的情况。

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

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

  3. 无论哪种方式都是相同的答案:greet方法返回Base中的值。属性未虚拟化。只有方法可以虚拟化。

答案 2 :(得分:0)

你试试看了吗?这打印" hello Base"。因为您正在调用Base的greet()方法(没有其他方法),所以它将访问Base的名称成员变量(通常在C ++成员变量中不会被称为'属性&#39 ;.)。希望我理解你的问题。

#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;
}