2017-05-29 52 views
-5

我使用纯虚拟方法,如下面的代码所示。为什么这种纯虚拟方法不能编译?

#include <iostream> 
using namespace std; 
class Advertisment 
{ 
public: 
    vitual void price (int Uchrg, int no_of_unt) = 0; 
    { 
    } 
}; 

class TVadvertisment : public Advertisment 
{ 
public: 
    void price (int Uchrg, int no_of_unt) 
    { 
     int adPrice = Uchrg * no_of_unt; 
     cout << "Advertisment Price: " << adPrice; 
    } 
}; 

int main() 
{ 
    TVadvertisment T; 
    T.price(1000, 60); 
    return 0; 
} 

因为我知道纯虚函数将被声明为virtual void display() = 0;。但是Code :: Blocks编译器由于此= 0而显示错误。没有它,它会成功编译。

而且我也没有使用指针来调用派生类的方法。

+0

请编辑您的问题,在问题本身中提供[mcve] *。 –

+0

_I使用Pure Virtual作为下面的内容。 **复制粘贴**问题本身的所有相关代码。 –

+2

请不要链接文字图片,只需将相关信息复制并粘贴到您的问题中即可。 – Rook

回答

1

您的函数是纯虚拟的,这意味着该方法是虚拟的,甚至不在基类(= 0)中实现。 所以你必须删除它后面的块。

它必须是:

virtual price(int Uchrg, int no_of_unt) = 0; 

没有{ }

虚拟的意思是,从基类继承的类可以覆盖该方法并通过基类接口调用。如果一个类有一个纯粹的虚拟方法,那么这个类就是抽象的,这个函数需要被从那个基类继承来的类来重写,以便实例化。

简而言之:

虚拟:

virtual price(int Uchrg, int no_of_unt) 
{ 
    // Implementation 
} 

拥有的实现是基类。子类别不是需要覆盖,但他们可以。该类不是抽象的,可以实例化。

纯虚:

virtual price(int Uchrg, int no_of_unt) = 0; // No implementation 

没有实现,子类必须重写这是不是抽象的。

呼叫经由基类的虚拟方法:

Base* pBase = new Derived; 
pBase->fun(); 

的方法是通过基类的接口调用,但它将是派生类的方法。

相关问题