在 C++ 中使用接口时;你有你的抽象(父)类。然后你有从父类继承并实现纯虚函数的子类。
当另一个类使用(子)接口时,此时抽象类的意义何在?如果您尝试在函数中使用父类型,即返回类型Parent,您会得到编译器错误(可能是因为编译器不知道要分配多少内存)。
谁能告诉我上面的怎么做?
IE
父级 = 形状。孩子 = 矩形。第三个类,其中包含返回形状类型的方法?
提前感谢您的任何帮助/信息。
在 C++ 中使用接口时;你有你的抽象(父)类。然后你有从父类继承并实现纯虚函数的子类。
当另一个类使用(子)接口时,此时抽象类的意义何在?如果您尝试在函数中使用父类型,即返回类型Parent,您会得到编译器错误(可能是因为编译器不知道要分配多少内存)。
谁能告诉我上面的怎么做?
IE
父级 = 形状。孩子 = 矩形。第三个类,其中包含返回形状类型的方法?
提前感谢您的任何帮助/信息。
一个很大的优势是所有孩子共享相同的界面。如果你有第二个从父类继承的子类(Child = Circle),那么无论具体的子类如何,它们都可以使用相同的功能。
想象一下,你有一个带有指向形状指针的向量(vector < Shape* >),那么你在向量中有哪些形状并不重要,如果你的基类 Shape 有一个虚拟方法 Draw(),你可以使用它在没有明确知道如何实现 Draw 方法的情况下,从向量的每个元素中提取方法。
您不能实例化抽象类。时期。如果您有一个要通过基类接口访问的子级,则必须通过指针或对基类的引用来访问该子级。
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.
如果你不知道为什么这很方便,你应该研究一下“多态性”这个术语。
我认为您正在返回堆栈上的对象,这不起作用,因为您根本无法实例化抽象类型:
Parent Child::foo() {
return Child(12);
}
这意味着,编译器为 a 保留(或者更确切地说,将保留)空间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
由于协方差,您甚至可以直接返回 a 。C++ 允许您像Parent* Parent::foo();
继承自.Child* Child::foo();
Child
Parent