2013-03-13 62 views
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; 
} 

回答

1

是的。当您需要操作符实现的虚拟函数行为时使用此技术:您可以使用虚拟(或抽象)函数来定义操作符,并让专业化来决定如何实现该函数。

例如:

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不同的实现。

2

是的,这将起作用。你自己尝试过吗?

+2

+1。当然,有时候“尝试它”会导致诸如“y = x ++ + x ++”这样的事情 - 它会“有效”,但不会“每次都正确运行”。所以只是因为某些方法有效,并不意味着它是可以接受的,甚至是对的。 – 2013-03-13 17:37:57

1

是的,没关系。这允许您在基类中提供通用流程,其细节专门针对其子项。

请参阅template method

+0

好的,谢谢:)。我正在尝试func1中的一些复杂的东西,它给我链接器错误,我认为这是由于实现错误:) – raveesh 2013-03-13 17:36:20

2

不仅它是一种众所周知的工作方式来解决事情,但如果内联func2,这可能意味着没有额外的开销,而不是直接调用内部函数。显然,有时整个目的是在func1内部做一些事情,然后在中间或最后调用func2,但是在额外工作量很小的情况下,“额外功能层”可能完全消失。

相关问题