在基类的非虚函数中调用派生类中实现的基类的虚函数是否正确。就像是
class A
{
virtual void func1() = 0;
void func2()
{
func1();
}
};
class B : public A
{
virtual void func1()
{
//do something here;
}
};
int main()
{
A* obj = new B;
obj->func2();
return 0;
}
在基类的非虚函数中调用派生类中实现的基类的虚函数是否正确。就像是
class A
{
virtual void func1() = 0;
void func2()
{
func1();
}
};
class B : public A
{
virtual void func1()
{
//do something here;
}
};
int main()
{
A* obj = new B;
obj->func2();
return 0;
}
是的,这会起作用。你自己试过吗?
它不仅是一种众所周知且有效的解决问题的方法,而且如果func2
是内联的,这可能意味着与直接调用内部函数相比没有额外的开销。显然,有时整个目的是在内部做一些事情func1
,然后func2
在中间或最后调用,但在这种额外工作很少的情况下,“额外功能层”可能会完全消失。
是的,没关系。这允许您在基类中提供通用流程,其细节专门针对其子类。
请参阅模板方法。
是的。当您需要操作符实现的虚函数行为时使用此技术:您根据虚拟(或抽象)函数定义您的操作符,并让特化来决定如何实现该函数。
例子:
class base
{
// yada yada yada
base& operator=(const base& other) { return assign(other); }
protected:
virtual base& assign(const base& other) = 0; // specializations will decide
// what assignment means
};
编辑:该技术的另一个用途是允许您的类的专业化只控制更复杂操作的部分:
class database
{
public:
void execute(const std::string& query)
{
begin_transaction(); // in practice, this should be RAII
connection_.execute(query);
end_transaction();
}
protected:
virtual void begin_transaction() = 0;
virtual void end_transaction() = 0;
private:
whatever &connection_;
};
在数据库专业化中,假设mysql_database::begin_transaction
将具有与sqlite_database::begin_transaction
.