Я не совсем уверен, какую терминологию использовать, но вот мой пример:
class Base {
public:
virtual void test() = 0;
};
class Mixin {
public:
virtual void test() { }
};
class Example : public Base, public Mixin {
};
int main(int argc, char** argv) {
Example example;
example.test();
return 0;
}
Я хочу, чтобы мой Mixin
класс реализовал чистую виртуальную функцию Base::test
, но когда я компилирую это, он говорит:
test.cpp: In function ‘int main(int, char**)’:
test.cpp:15:13: error: cannot declare variable ‘example’ to be of abstract type ‘Example’
Example example;
^
test.cpp:11:7: note: because the following virtual functions are pure within ‘Example’:
class Example : public Base, public Mixin {
^
test.cpp:3:18: note: virtual void Base::test()
virtual void test() = 0;
^
test.cpp:16:13: error: request for member ‘test’ is ambiguous
example.test();
^
test.cpp:8:18: note: candidates are: virtual void Mixin::test()
virtual void test() { }
^
test.cpp:3:18: note: virtual void Base::test()
virtual void test() = 0;
^
Я могу добавить выражение using
, чтобы оно не было двусмысленным:
class Example : public Base, public Mixin {
public:
using Mixin::test;
};
Но там сказано, что я до сих пор не реализовал это:
test.cpp: In function ‘int main(int, char**)’:
test.cpp:17:13: error: cannot declare variable ‘example’ to be of abstract type ‘Example’
Example example;
^
test.cpp:11:7: note: because the following virtual functions are pure within ‘Example’:
class Example : public Base, public Mixin {
^
test.cpp:3:18: note: virtual void Base::test()
virtual void test() = 0;
^
Можно ли сделать это?
Я знаю, что один из вариантов - сделать Mixin
наследовать от Base
, но в моем случае есть несколько производных классов, и у них нет общего предка.
Mixin
. - person Brendan Long   schedule 23.10.2013