虚拟差异语法C ++

时间:2011-01-07 07:37:40

标签: c++

使用C ++,虚拟就像这样使用?两者有什么区别?

class Animal
{
public: 
    virtual void something();
    virtual void something() = 0; 
}

6 个答案:

答案 0 :(得分:1)

virtual void something() = 0; // says it is a pure virtual function
virtual void something(); // is a virtual function

包含至少一个纯虚函数的类称为抽象基类。抽象基类和常规多态类之间的主要区别在于,因为在抽象基类中,至少有一个成员缺少实现,我们无法创建它的实例(对象)。

答案 1 :(得分:1)

第一个声明该函数是 virtual :该子类可以覆盖该行为。但是,该函数仍然在基类中有一个实现。第二个是纯虚拟:它没有实现,必须由子类重写。它类似于Java和C#中的abstract关键字。它也使类抽象化,因此无法实例化。

答案 2 :(得分:1)

我可能对此很模糊,但我认为第一个说:你可以覆盖我,第二个说,你必须覆盖我。

答案 3 :(得分:0)

第二个“某事”必须由子类实现,并且任何包含“xxx()= 0”的类都不能直接实例化。它被称为“纯虚拟”函数,包含它们的类是“抽象的”。只包含纯虚拟的类是“纯抽象”。

答案 4 :(得分:0)

第一个就是声明一个虚方法。如果扩展该类并重写该方法,则调用子类的实现。

第二个是纯虚方法。换句话说,如果没有首先为something()提供定义,那么你的类或任何扩展它的类都不会被实例化(抽象)。

答案 5 :(得分:0)

考虑:

class Sloth : public Animal { void something() { ... } };

Animal animal;
Sloth sloth;

在这里,我们试图创建两个对象 - 动物和树懒。但是,我们应该被允许创造一种动物吗?也许程序员已经创建了Animal,因此它可以用于多态地引用派生类型,如:

std::vector<Animal*> zoo;
zoo.push_back(new Sloth());
zoo.push_back(new Sea_Eagle());

他们可能希望p_animal->something()做一些有用的事情。鉴于Animal只针对这种多态抽象,任何人将实际的“new Animal()”对象直接放入动物园(或在程序中的任何其他位置操作)都是错误的。

说它有可能 - 如果使用这个Animal类的程序员创建一个实例并调用something()函数,会发生什么?也许没什么,或者它可能是一个错误条件,并且永远不会出现在良好的代码中 - 而不是让Animal的something()函数打印错误消息或在运行时抛出异常。这是丑陋的 - 运行时错误意味着当客户端尝试使用它时程序失败。

C ++支持“= 0”表示法,以便编译器知道阻止(基类)Animal对象在编译时创建,因此您可以发送始终有效的软件为用户。