在 C++ 之间共享实现 类
Sharing implementation between C++ classes
我希望能够在一些(但不是全部)相同基础 class 的 class 之间共享实现。为了概念上的正确性,我想使用 C++ 的多重继承功能来做到这一点(我知道一个解决方案可能是使用组合来代替)。
class A
{
public:
A()
{
cout << "Constructed A" << endl;
}
void DoAStuff()
{
cout << "Did A stuff" << endl;
}
};
class I : public virtual A
{
public:
I()
{
cout << "Constructed I" << endl;
}
void DoIStuff()
{
DoAStuff();
cout << "Did I stuff" << endl;
}
};
class B : public A
{
public:
B()
{
cout << "Constructed B" << endl;
}
void DoBStuff()
{
cout << "Did B stuff" << endl;
}
};
class C : public A, public I
{
public:
C()
{
cout << "Constructed C" << endl;
}
void DoCStuff()
{
cout << "Did C stuff" << endl;
}
};
class D : public A, public I
{
public:
D()
{
cout << "Constructed D" << endl;
}
void DoDStuff()
{
cout << "Did D stuff" << endl;
}
};
int main()
{
cout << "Creating a B" << endl;
B *b = new B();
cout << "Creating a C" << endl;
C *c = new C();
c->DoIStuff();
cin.ignore();
return 0;
}
在这个例子中,我有 blase class A
,我想使用从 A
派生的 3 个 classes:B
,C
和 D
.
C
和 D
共享共同的实现,我在单独的 class I
中实现了 DoIStuff()
。由于此实现需要执行基础 class A
中定义的内容,因此 I
也继承了 A
。 virtual 关键字在那里,因为在创建 C
或 D
.
时我只需要一个 A
实例
这一切对我来说看起来很漂亮且富有表现力,但是当我尝试编译它时(使用 VS 2008 的 VC++ 编译器)我得到以下 2 个错误:
error C2584: 'C' : direct base 'A' is inaccessible; already a base of 'I'
error C2584: 'D' : direct base 'A' is inaccessible; already a base of 'I'
为了使它与多重继承一起工作,添加一个 "placeholder" class(例如 J
)继承 A
(但不做任何其他事情)和从这个 class 继承 D
和 C
而不是直接从 A
继承似乎可行。但是,此占位符 class 使代码的表现力稍差,并且难以理解。
或者,我可以让 DoIStuff
使用 A
参数,这意味着 I
不必继承自 A
。但是,这意味着我必须在 D
和 C
.
中重载 DoIStuff
有谁知道在这种情况下共享实施的最佳解决方案是什么?
你需要
1. class D : public virtual A, public I
2. class C : public virtual A, public I
否则无法正确设置多重继承钻石
也请仔细阅读奇怪的重复模板模式。这可能是一个可行的替代方案。
我希望能够在一些(但不是全部)相同基础 class 的 class 之间共享实现。为了概念上的正确性,我想使用 C++ 的多重继承功能来做到这一点(我知道一个解决方案可能是使用组合来代替)。
class A
{
public:
A()
{
cout << "Constructed A" << endl;
}
void DoAStuff()
{
cout << "Did A stuff" << endl;
}
};
class I : public virtual A
{
public:
I()
{
cout << "Constructed I" << endl;
}
void DoIStuff()
{
DoAStuff();
cout << "Did I stuff" << endl;
}
};
class B : public A
{
public:
B()
{
cout << "Constructed B" << endl;
}
void DoBStuff()
{
cout << "Did B stuff" << endl;
}
};
class C : public A, public I
{
public:
C()
{
cout << "Constructed C" << endl;
}
void DoCStuff()
{
cout << "Did C stuff" << endl;
}
};
class D : public A, public I
{
public:
D()
{
cout << "Constructed D" << endl;
}
void DoDStuff()
{
cout << "Did D stuff" << endl;
}
};
int main()
{
cout << "Creating a B" << endl;
B *b = new B();
cout << "Creating a C" << endl;
C *c = new C();
c->DoIStuff();
cin.ignore();
return 0;
}
在这个例子中,我有 blase class A
,我想使用从 A
派生的 3 个 classes:B
,C
和 D
.
C
和 D
共享共同的实现,我在单独的 class I
中实现了 DoIStuff()
。由于此实现需要执行基础 class A
中定义的内容,因此 I
也继承了 A
。 virtual 关键字在那里,因为在创建 C
或 D
.
A
实例
这一切对我来说看起来很漂亮且富有表现力,但是当我尝试编译它时(使用 VS 2008 的 VC++ 编译器)我得到以下 2 个错误:
error C2584: 'C' : direct base 'A' is inaccessible; already a base of 'I'
error C2584: 'D' : direct base 'A' is inaccessible; already a base of 'I'
为了使它与多重继承一起工作,添加一个 "placeholder" class(例如 J
)继承 A
(但不做任何其他事情)和从这个 class 继承 D
和 C
而不是直接从 A
继承似乎可行。但是,此占位符 class 使代码的表现力稍差,并且难以理解。
或者,我可以让 DoIStuff
使用 A
参数,这意味着 I
不必继承自 A
。但是,这意味着我必须在 D
和 C
.
DoIStuff
有谁知道在这种情况下共享实施的最佳解决方案是什么?
你需要
1. class D : public virtual A, public I
2. class C : public virtual A, public I
否则无法正确设置多重继承钻石
也请仔细阅读奇怪的重复模板模式。这可能是一个可行的替代方案。