繁体   English   中英

在抽象类中使用纯虚方法

[英]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中声明的两个函数都是虚函数,您可以将它们视为虚函数。 因此, Btest1实现应简单地调用test2 没有A::预选赛。 这将进行虚拟调用,并最终取决于对象的类型,最终生成test2的最高派生版本,即CC1定义的版本。 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

几乎可以肯定,您想虚拟地调用该函数(即在CC1或任何其他方式中调用最终替代)。 在这种情况下,完全没有资格:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM