指针与继承C ++ oop之间的关系

时间:2018-10-10 20:48:39

标签: c++ oop pointers inheritance relationship

任何人都可以表达一个简短的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; 
}

2 个答案:

答案 0 :(得分:1)

您将基类MakeSound隐藏在其他MakeSound的覆盖下,因此它不参与重载解析。在Dog中要么覆盖二者,要么都不覆盖它们,或者将其中之一重命名为MakeNoise

答案 1 :(得分:0)

两者之间确实没有什么关系,一个交叉点是,要利用多态行为(虚拟成员),您必须使用指针或引用。如果将派生实例分配给实际的基本实例(而不是将派生对象的地址分配给基本指针或使用派生实例初始化基本引用),则任何派生功能都将丢失(通常用术语调用该对象)切片)。

请注意,在您的示例中,虚拟虚空make_sound(char const *)没有太多意义,更常见的是使用虚拟虚空make_sound()形式,并且派生类型知道会产生哪种声音