[英]Use pure virtual methods in an abstract class
#ifndef TEST_H
#define TEST_H
#include <iostream>
#include <string>
class A{
public:
virtual void test1() = 0;
virtual std::string test2() = 0;
};
class B : public A{
public:
void test1(){
std::cout << A::test2() << " World";
}
};
class C : public B{
public:
std::string test2(){
return "hello";
}
};
class C1 : public B{
public:
std::string test2(){
return "Sup";
}
};
#endif // TEST_H
我有一个仅包含纯虚方法的接口A。 我有一个抽象类,想要实现test1
并使用test2
来实现test1
。
现在,C和C1以及实现test2
具体类
但是我不能做std::cout << A::test2() << " World";
B班
错误:无法在没有对象的情况下调用成员函数“虚拟std :: string A :: test2()”
我将如何在C ++中执行类似的操作?
不要迷上纯虚拟与虚拟。 在A
中声明的两个函数都是虚函数,您可以将它们视为虚函数。 因此, B
的test1
实现应简单地调用test2
。 没有A::
预选赛。 这将进行虚拟调用,并最终取决于对象的类型,最终生成test2
的最高派生版本,即C
或C1
定义的版本。 从A::test2()
删除A::
后,以下代码可以正常工作(应如此):
int main() {
C c;
c.test1();
C1 c1;
c1.test1();
return 0;
}
[work]$ g++ test.cpp
[work]$ ./a.out
hello WorldSup World[work]$
是的,您应该在输出中添加\\n
。 <g>
您的class B
需要从class A
继承。
class B: public A ...
当然,调用A::test2()
无效,因为该类未实现-它没有主体。 您可以通过在类A中实现它来解决该问题,如下所示:
std::string A::test2() { return "some string"; }
如果要虚拟呼叫,请不要使用显式作用域限定。 使用A::test2
将尝试调用A::test2
,而不进行动态分配。 而这又将因为A::test2
没有实现而无法链接。
该错误消息表示,在编译它时, B
不会从A
继承,因此没有类型为A
对象可以调用成员函数。 您发布的代码给了我一个不同的错误:未定义A::test2
。
几乎可以肯定,您想虚拟地调用该函数(即在C
或C1
或任何其他方式中调用最终替代)。 在这种情况下,完全没有资格:
std::cout << test2() << std::endl;
您的代码尝试专门调用A
声明的版本,而不是任何覆盖。 如果这确实是您想要的(我对此表示怀疑),则需要定义该功能:
std::string A::test2() {
return "I'm a pure virtual function. Why are you calling me?";
}
请注意,由于语言的怪异,无法在类定义内定义纯虚函数。 该定义将超出类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.