指针与继承C++ OOP的关系 任何一个可以表达一个简短的C++代码,它应该显示指针和继承的关系。

指针与继承C++ OOP的关系 任何一个可以表达一个简短的C++代码,它应该显示指针和继承的关系。,c++,oop,pointers,inheritance,relationship,C++,Oop,Pointers,Inheritance,Relationship,我相信下面的代码指的是我的问题 class Animal { public: virtual void MakeSound(const char* pNoise) { ... } virtual void MakeSound() { ... } }; class Dog : public Animal { public: virtual void MakeSound() {... } }; int main() { Anima

我相信下面的代码指的是我的问题

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

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


请注意,在您的示例中,虚拟void make_soundchar const*并没有多大意义,更常见的是使用虚拟void make_sound形式,派生类型知道要产生什么样的声音。

您隐藏基类MakeSound并覆盖其他MakeSound,这样它就不会参与重载解析。要么在Dog中同时覆盖这两个,要么都不覆盖,要么将其中一个重命名为MakeNoise。

您能建议一个详细的代码满足我的要求吗?有人能用完整的代码共享一个正确的解决方案吗?什么问题的解决方案?你发布了格式错误的程序,我列出了3种修复方法。你能告诉我它是否好吗?虚拟空间};int main{Animal*a=new Dog;Dog*d=new Dog;a->MakeSoundbark;d->MakeNoisebark;//不编译返回0;}如果您真的需要,可以调用d->Animal::MakeSoundbark,但我认为这不是推荐的做法