在C ++接口中返回父类型

时间:2012-07-06 10:54:58

标签: c++

在c ++中使用接口时;你有你的抽象(父)类。然后你有了继承自父类的子类,并实现了纯虚函数。

当另一个类使用(子)接口时,此时抽象类中的要点是什么?如果您尝试在函数中使用父类型,即返回类型Parent,则会出现编译器错误(可能是因为编译器不知道要分配多少内存)。

谁能告诉我怎么做?

父=形状。 Child =矩形。 Thrid类包含返回Shape的类型的方法?

提前感谢您提供任何帮助/信息。

3 个答案:

答案 0 :(得分:2)

一个很大的优势是所有孩子都拥有相同的界面。如果你有一个继承自父(Child = Circle)的第二个孩子,那么无论特定的子类如何,它们都可以使用相同的函数。

想象一下,你有一个带有形状指针的向量(向量< Shape *>),那么如果你的基类Shape有一个虚方法Draw(),你在向量中有哪些形状并不重要,你可以在向量的每个元素中使用该方法,而无需明确知道如何实现Draw方法。

答案 1 :(得分:1)

您无法实例化抽象类。期。如果您有要通过基类接口访问的子项,则必须通过指针或对基类的引用来访问子项。

class A
{
public:
  virtual void doit() = 0;
}

class B : public A
{
public:
  virtual void doit()
  {std::cout << "Hi.";}
}

...later, in main

A *a = new B;
a->doit(); //this calls B's implementation.

如果你不知道为什么这很方便,你应该研究“多态性”一词。

答案 2 :(得分:0)

我认为你正在返回堆栈上的对象,这不起作用,因为你根本无法实例化抽象类型:

Parent Child::foo() {
  return Child(12);
}

这意味着,编译器保留(或者更确切地说,将保留)Parent的空间。并且在调用Parent时尝试复制构造foo

可能的意思是:

Parent* Child::foo() {
  return new Child(12); // actually you should really be using a shared pointer here, but that's a different story
}

这是有效的,因为指向Parent的指针和指向Child的指针具有大小和对齐方式。

由于协方差,您甚至可以直接返回Child。如果Parent* Parent::foo();继承自Child* Child::foo();,则C ++允许您将Child实现为Parent