虚拟语法C++


Virtual difference syntax C++

本问题已经有最佳答案,请猛点这里访问。

用C++,虚拟是这样使用的吗?两者有什么区别?

1
2
3
4
5
6
class Animal
{
public:
    virtual void something();
    virtual void something() = 0;
}

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


第一种声明函数是虚拟的:子类可以覆盖行为。但是,函数在基类中仍然有一个实现。第二个是纯虚拟的:它没有实现,必须由子类重写。它类似于EDCOX1的0个关键字爪哇和C。它也使类成为抽象的,所以它不能被实例化。


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

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


考虑:

1
2
3
4
class Sloth : public Animal { void something() { ... } };

Animal animal;
Sloth sloth;

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

1
2
3
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"符号,以便编译器知道防止(基类)EDCOX1 2个对象在编译时被创建,这样您就可以传送对用户工作的软件。


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

第二种方法是纯虚拟方法。换句话说,在没有首先为something()提供定义的情况下,类或扩展它的任何类都不能被实例化(抽象)。


第二个"something"必须由子类实现,任何包含"xxx()=0"的类都不能直接实例化。它被称为"纯虚拟"函数,包含这些函数的类是"抽象"的。只包含纯虚拟的类是"纯抽象的"。