任何人都可以表达一个简短的c ++代码,该代码应显示指针与继承之间的关系。
我相信以下代码是我的问题
class Animal {
public:
virtual void MakeSound(const char* pNoise) { ... }
virtual void MakeSound() { ... }
};
class Dog : public Animal {
public:
virtual void MakeSound() {... }
};
int main() {
Animal* a = new Dog();
Dog* d = new Dog();
a->MakeSound("bark");
d->MakeSound("bark"); // Does not compile
return 0;
}
答案 0 :(得分:1)
您将基类MakeSound
隐藏在其他MakeSound
的覆盖下,因此它不参与重载解析。在Dog
中要么覆盖二者,要么都不覆盖它们,或者将其中之一重命名为MakeNoise
。
答案 1 :(得分:0)
两者之间确实没有什么关系,一个交叉点是,要利用多态行为(虚拟成员),您必须使用指针或引用。如果将派生实例分配给实际的基本实例(而不是将派生对象的地址分配给基本指针或使用派生实例初始化基本引用),则任何派生功能都将丢失(通常用术语调用该对象)切片)。
请注意,在您的示例中,虚拟虚空make_sound(char const *)没有太多意义,更常见的是使用虚拟虚空make_sound()形式,并且派生类型知道会产生哪种声音