是否可以让派生类具有两组与基类相同的虚函数?我想做类似以下的事情。这个想法能够在两组函数指针之间进行选择。
class Base
{
virtual void func1;
virtual void func2;
};
class Derived: Base
{
float somemember;
void somefunction()
{
Base* func = this->derived_functions1;
}
class derived_functions1
{
virtual void func1()
{
return somemember*100;
}
virtual void func2;
};
class derived_functions2
{
virtual void func1;
virtual void func2;
};
};
答案 0 :(得分:3)
class Base
{
public:
virtual void func1();
virtual ~Base(){}
};
struct Impl1 : Base
{
void func1() override {}
};
struct Impl2 : Base
{
void func1() override {}
};
struct Derived : Base
{
Derived(std::unique_ptr<Base> implementation) :
impl(std::move(implementation))
{}
void func1() override { impl->func1(); }
void changeImpl(std::unique_ptr<Base> implementation)
{
impl = std::move(implementation);
}
private:
std::unique_ptr<Base> impl;
};
答案 1 :(得分:1)
不是你的方式。但是你可以让内部class derived_functionsX
成为他们public: Base
,而不是让你的主Derived
包含std::unique_ptr<Base> ptr
,你可以设置为new derived_functions1
或{{ 1}}
并在new derived_functions2
Derived
和func1
中实施,以致电func2
和ptr->func1()
。
要使所有工作正常,ptr->func2()
也必须有Base
,否则无法正确删除。
答案 2 :(得分:0)
在此示例中,它不会编译,因为derived_function1
和derived_functions2
不是从Base
继承的。
但你可以这样:
class Base
{
virtual void func1();
virtual void func2();
};
class Wrapper {
public:
Wrapper(int arg)
{
switch(arg)
{
case 1:
b = new derived_functions1;
break;
case 2:
b = new derived_functions2;
break;
default:
cout << "bad value of arg" << arg << endl;
exit(1);
}
}
~Wrapper()
{
delete b;
}
Base* GetClass()
{
return b;
}
private:
Base *b;
class derived_functions1: public Base
{
virtual void func1();
virtual void func2();
};
class derived_functions2: public Base
{
virtual void func1();
virtual void func2();
};
};
答案 3 :(得分:0)
简短回答:否。类只能覆盖一次继承的虚函数。
但是,有一种设计模式可以即时交换函数的行为,称为策略模式。简而言之:具有可交换行为的类具有指向策略基类的指针,该基类定义该行为的接口。它包含具体的战略类。具有不同行为的函数只是将其调用委托给策略指针。以下是根据您的问题量身定制的示例:
class Base {
public:
virtual void func1() = 0;
virtual void func2() = 0;
virtual ~Base(){}
};
#include <iostream>
#include <memory>
class Derived : public Base
{
struct F1Strategy {
virtual void f1Impl() = 0;
virtual ~F1Strategy() {}
};
struct Impl1 : F1Strategy {
void f1Impl() override { std::cout << "one!\n"; }
};
struct Impl2 : F1Strategy {
void f1Impl() override { std::cout << "two?\n"; }
};
std::unique_ptr<F1Strategy> f1Strategy;
public:
Derived()
: f1Strategy(new Impl1())
{}
void func1() override { f1Strategy->f1Impl(); }
void func2() override {
static std::unique_ptr<F1Strategy> otherStrategy(new Impl2());
f1Strategy.swap(otherStrategy);
}
};
int main() {
std::unique_ptr<Base> pb(new Derived());
pb->func1(); // ==> one!
pb->func2(); //swap
pb->func1(); // ==> two?
pb->func1(); // ==> two?
pb->func2(); //swap
pb->func1(); // ==> one!
}
查看实际操作:http://ideone.com/zk3UTI