2009-12-10 117 views
1

在C++程序:纯虚函数

   #include<iostream.h> 
       class A 
       { 
        public: virtual void func()=0; 
       }; 
       class B:public A 
       { 
        public: void show() 
          { 
            func(); 
          } 
       }; 
       void B::func() 
       { 
         cout<<"In B"<<endl; 
       } 
       int main() 
       { 
        B b; 
        b.show(); 
       } 

如果虚拟函数,FUNC()被B类的主体内重新定义,没有错误。但是,当使用范围解析运算符时,编译器会引发错误。 这是为什么?

+1

不这样做你的问题,但标准的头为,是不是也可以用 2009-12-10 10:24:54

+1

iostream.h旧式标准至极虽然 不建议 – 2009-12-10 12:10:48

回答

13

这是没有直接关系的func是虚拟的,你总是需要声明它的类:

class B:public A 
{ 
    public: void show() 
    { 
     func(); 
    } 

    void func(); // add this 
}; 

void B::func() 
{ 
    cout<<"In B"<<endl; 
} 
+3

否则它不会知道B定义了func,并且会尝试在A中使用纯虚拟版本,因为它是纯虚拟的,所以它不能使用纯虚拟版本 – Xetius 2009-12-10 10:22:43

+0

@ Xetius:Please;如果您不知道,请在回答之前尝试编译测试代码。如果在B中没有定义'func',那么show()将使用A中的版本。这是绝对好的。因为在运行时它会调用属于当前实例的派生版本。如果B没有定义'func',那么它是一个抽象类,你将不能实例化一个B的实例。 – 2009-12-10 16:37:28

4

你必须声明你重新定义B类成员函数func()

class B:public A 
{ 
    virtual void func(); 
public: 
    void show() {func(); } 
}; 
直接