gpt4 book ai didi

c++ - 抽象基类、多重继承、普通纯虚方法

转载 作者:搜寻专家 更新时间:2023-10-31 01:49:48 24 4
gpt4 key购买 nike

下面的测试代码似乎表明,如果一个类有两个具有公共(public)纯虚方法的抽象基类,那么这些方法在派生类中是“共享”的。

#include <iostream>
#include <string>

using namespace std;

struct A
{
virtual string do_a() const = 0;
virtual void set_foo(int x) = 0;
virtual int get_foo() const = 0;
virtual ~A() {}
};

struct B
{
virtual string do_b() const = 0;
virtual void set_foo(int x) = 0;
virtual int get_foo() const = 0;
virtual ~B() {}
};

struct C : public A, public B
{
C() : foo(0) {}
string do_a() const { return "A"; }
string do_b() const { return "B"; }
void set_foo(int x) { foo = x; }
int get_foo() const { return foo; }
int foo;
};

int main()
{
C c;
A& a = c;
B& b = c;
c.set_foo(1);
cout << a.do_a() << a.get_foo() << endl;
cout << b.do_b() << b.get_foo() << endl;
cout << c.do_a() << c.do_b() << c.get_foo() << endl;
a.set_foo(2);
cout << a.do_a() << a.get_foo() << endl;
cout << b.do_b() << b.get_foo() << endl;
cout << c.do_a() << c.do_b() << c.get_foo() << endl;
b.set_foo(3);
cout << a.do_a() << a.get_foo() << endl;
cout << b.do_b() << b.get_foo() << endl;
cout << c.do_a() << c.do_b() << c.get_foo() << endl;
}

此代码使用 -std=c++98 -pedantic -Wall -Wextra -Werror 在 g++ 4.1.2(公认的旧版本)中编译干净。输出是:

A1
B1
AB1
A2
B2
AB2
A3
B3
AB3

这是我想要的,但我怀疑这是否普遍有效,或者只是“偶然”。从根本上说,这是我的问题:我可以依赖这种行为,还是应该始终从此类场景的虚拟基类继承?

最佳答案

不要让它比现在更难。与基类中的虚函数具有相同签名的函数会覆盖基版本。不管你有多少个基地,或者另一个基地是否有一个具有相同签名的虚函数。所以,是的,这行得通。

关于c++ - 抽象基类、多重继承、普通纯虚方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16040411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com