在c ++中使用接口时;你有你的抽象(父)类。然后你有了继承自父类的子类,并实现了纯虚函数。
当另一个类使用(子)接口时,此时抽象类中的要点是什么?如果您尝试在函数中使用父类型,即返回类型Parent,则会出现编译器错误(可能是因为编译器不知道要分配多少内存)。
谁能告诉我怎么做?
即
父=形状。 Child =矩形。 Thrid类包含返回Shape的类型的方法?
提前感谢您提供任何帮助/信息。
答案 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
。