指针与继承的关系 c++ oop

Posted

技术标签:

【中文标题】指针与继承的关系 c++ oop【英文标题】:Relationship between pointer and inheritance c++ oop 【发布时间】:2018-10-10 20:48:38 【问题描述】:

谁能写一段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; 

【问题讨论】:

【参考方案1】:

您隐藏基类MakeSound 并覆盖其他MakeSound,因此它不参与重载决议。在 Dog 中覆盖两者或都不覆盖,或者将其中之一重命名为 MakeNoise

【讨论】:

有人可以用完整的代码分享一个正确的解决方案吗? 解决什么问题?您发布了格式错误的程序,我列出了 3 种修复方法。 你能告诉我好不好用吗?虚空 MakeSound() ; int main() Animal* a = new Dog();狗* d = 新狗(); a->MakeSound("吠声"); d->MakeNoise("吠声"); // 不编译 return 0; 如果你真的想要,你可以拨打d->Animal::MakeSound("bark"),但我不认为这是推荐的做法【参考方案2】:

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

请注意,在您的示例中,没有太多指向虚拟 void make_sound(char const *),更常见的是使用虚拟 void make_sound() 形式,并且派生类型知道要产生什么样的声音.

【讨论】:

你能推荐一个详细的代码来满足我的要求吗?

以上是关于指针与继承的关系 c++ oop的主要内容,如果未能解决你的问题,请参考以下文章

C++笔记--面向对象(OOP)编程基础--类的继承及多态

C++认知继承

Python OOP-2

OOP2(虚函数/抽象基类/访问控制与继承)

C++的探索路11继承与派生之拓展篇--多形式派生以及派生类指针转换

C++继承多态总结