2012-02-27 66 views
0

具有相同名称作为基类创建一个功能我有一个要求,如下例:如何派生

class Base 
{ 

public: 
Base() { cout << "Base Class Constructor";} 
virtual ~Base() { cout << "Base Class Destructor";} 
}; 

class Der : public Base 
{ 
public: 
    Der() { cout << "Der Class Constructor";} 
    ~Der() { cout << "Der Class Destructor";} 
    void Base() {cout << "Der Class function";} 
}; 

int main(int argc, char* argv[]) 
{ 
    Base *ptr = new Der(); 
    ptr->Base(); // throwing error here - "Invalid use of class Base". My intention is to call Der::Base() function. 
    return 1; 
} 

请任何一个建议我打电话功能的方式“空基地()”,宣布在Der类中通过指向Der对象的Base指针。

IDE:Qt Creator的 操作系统:Ubuntu的10.10 编译器:GCC(X86)

回答

1

具有相同名称的成员函数作为基类是品味极差,容易出错(使代码不可读人类)。你确定你无法避免吗?

一个常见的约定是类名以大写字母开头,成员函数以小写字母开头。如果你遵循这个惯例,你将不会像你一样受到伤害!

如果你真的坚持,你可以尝试

(static_cast<Der*>(ptr))->Base(); 

一个更安全的方式也能像

{ Der* derptr = dynamic_cast<Der*>(ptr); 
    if (derptr) 
     derptr->Base(); 
    } 

但实际上,你应该避免编码这种无感到代码的东西。您的代码变得不可读,而且会伤害你,甚至在几个星期...

不要忘了g++ -Wall -g编译代码(改善它,直到你没有编译警告),并使用gdb调试器调试它。不要忘记用<< endl来结束输出语句。

你的代码还有其他错误。它不编译,即使main保持为空

+0

嗨巴西尔,感谢您的快速回复。这解决了我的问题。 – user1235206 2012-02-27 10:20:50

+0

但我不认为这解决了你的误解......你真的应该避免这种情况。如果这是一项家庭作业,由于误解和糟糕的编码惯例(使您的代码无法读取,即使对您的老师而言),它也值得评分不好。 – 2012-02-27 10:23:50

+0

再次感谢。我确实遵循编码惯例,以至于我从未遇到过这种情况。 – user1235206 2012-02-27 10:30:09