因此,如果父类greet
中存在函数Base
并且它是虚拟的。
父类中有一个名为name
的属性。
现在名为Child
的类继承了它,greet
未实现,但name
类中的属性Child
已更改。因此,在致电Child.greet()
时,它会使用孩子的name
还是家长的name
?
非常感谢对设计决策原因的解释。
答案 0 :(得分:1)
它在调用时使用name
的值。如果孩子在调用greet
之前设置了名称,那么它将使用孩子设置的值。如果孩子在调用greet
后设置了名称,那么它将使用默认值或呼叫前设置的任何值。
答案 1 :(得分:1)
[我编辑了问题以澄清格式。]
这里有两种可能的情况。
如果name
属性是私有属性并在Child
中重新定义,则有两个单独的变量,每个变量都有自己的值。 greet
方法只能看到它自己的方法。这是意图吗?
如果未重新定义name
属性,则只有一个属性和一个值。 greet
方法返回该值。
无论哪种方式都是相同的答案: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;
}