我可以将继承的类指针用作父类指针吗?

Posted

技术标签:

【中文标题】我可以将继承的类指针用作父类指针吗?【英文标题】:Can I use inherited class pointers just as parent's? 【发布时间】:2012-06-10 08:21:34 【问题描述】:

我的两个类:Parent 和 Child 是相同的(目前)并且具​​有相同的构造函数。

class Parent
protected:
  string name;
public:
  Parent(string &n, vector <int> &v) 
  /* read n and v into vars */
;

class Child : public Parent 
public:
  Child(string &n, vector <int> &v) : Parent(n, v) 
;
vector <int> val;
string nam, numb;
if(val[0] == 0) 
  Child* ptr = new Child(nam, val);
else
  Parent* ptr = new Parent(nam, val);

myMap.insert(Maptype::value_type(numb, ptr) );

将 Child* ptr 对象作为 Parent* ptr 对象传递是否合法?我听说它们具有相同的指针类型,所以应该没问题。那我为什么会得到 警告:未使用的变量“ptr” 警告:未使用的变量“ptr” 错误:未在此范围内声明“ptr” ? 我的程序仅适用于 Parent 类。我觉得我没有继承父母的权利。

【问题讨论】:

“父/子”不是 C++ 对象模型的一个很好的比喻,尤其是公共继承。 “基础”和“派生”要好得多。子类不是父类,但派生类在某种意义上是它们的公共基类的一个版本。 【参考方案1】:

代码创建了两个单独的变量ptr,它们的作用域都非常有限。

考虑以下几点:

if(val[0] == 0) 
  Child* ptr = new Child(nam, val);
else
  Parent* ptr = new Parent(nam, val);

相当于:

if(val[0] == 0) 
  Child* ptr = new Child(nam, val);
 else 
  Parent* ptr = new Parent(nam, val);

// neither of the `ptr' variables is in scope here

这是修复代码的一种方法:

Parent* ptr;
if(val[0] == 0) 
  ptr = new Child(nam, val);
else
  ptr = new Parent(nam, val);

完成此操作后,您还需要确保Parent 具有虚拟析构函数。见When to use virtual destructors?

【讨论】:

谢谢。为什么这些指针具有相同的类型对我来说仍然有点神秘。 @user1078719:实际上,他们没有。但是,Child* 可以转换为 Parent*。 parashift.com/c++-faq-lite/basics-of-inheritance.html#faq-19.4【参考方案2】:

因为你只在 if 语句中声明了 ptr,所以试着在 if 语句的上方声明它,这样它可能就像 aix 的答案

【讨论】:

以上是关于我可以将继承的类指针用作父类指针吗?的主要内容,如果未能解决你的问题,请参考以下文章

您可以拥有与您继承的基类相同的类的私有成员吗?

使用 Gilead 持久化具有继承的类

抽象类指针

基本语言

C++继承多态总结

如果继承类型受到保护,我可以使基类的指针指向派生对象吗? [复制]