0

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

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

谁能告诉我上面的怎么做?

IE

父级 = 形状。孩子 = 矩形。第三个类,其中包含返回形状类型的方法?

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

4

3 回答 3

2

一个很大的优势是所有孩子共享相同的界面。如果你有第二个从父类继承的子类(Child = Circle),那么无论具体的子类如何,它们都可以使用相同的功能。

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

于 2012-07-06T11:03:05.020 回答
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.

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

于 2012-07-06T11:04:29.560 回答
0

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

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

这意味着,编译器为 a 保留(或者更确切地说,将保留)空间ParentParent并在调用时尝试复制构造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由于协方差,您甚至可以直接返回 a 。C++ 允许您像Parent* Parent::foo();继承自.Child* Child::foo();ChildParent

于 2012-07-06T11:03:28.343 回答