假设我告诉你,class D是由class B以public形式派生而来的,class B定义有一个public成员函数mf。由于mf的参数和返回值都不重要,所以我认为它们是void。看下面的代码:

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
class B
public:
	void mf();
class D : public B
//public:
//	void mf();
int main()
	B* pB = &x;
	pB->mf();
	D* pD = &x;
	pD->mf();
    return 0;
在这段代码中,pB和pD调用的mf都是基类里面的mf()。不管他们的指针指向的是基类对象还是派生类对象。

在看下面的代码:

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
class B
public:
	void mf();
class D : public B
public:
	void mf();
int main()
	B* pB = &x;
	pB->mf();
	D* pD = &x;
	pD->mf();
    return 0;

现在pD和pB调用的就是各自的mf了。造成这种行为的是,non-virtual函数如B::mf和D::mf都是静态绑定的。这句话的意思是,由于pB被声明为一个pointer-to-B,通过pB调用的non-virtual函数永远是B所定义的版本,即使pB指向一个类型为“B类派生的class”对象。

但是另一方面,virtual函数却是动态绑定的,所以他们不存在这个问题。如果mf是一个virtual函数,不论是通过pB还是pD调用mf。都会导致调用D::mf,因为pB和pD真正指向的都是一个类型为D的对象。

如果你正在编写class D并重新定义继承自class B的non-virtual函数mf,D对象很可能展现出精神分裂的不一致行径。更明确的说,当mf被调用,任何一个D对象都可能表现出B或D的行为。决定因素不在对象自身,而在于 “指向该对象的指针类型”。References也会展现和指针一样难以理解的行径。

这也就解释了,为什么基类的析构函数要设计为virtual函数!

假设我告诉你,class D是由class B以public形式派生而来的,class B定义有一个public成员函数mf。由于mf的参数和返回值都不重要,所以我认为它们是void。看下面的代码:// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"class B{public: void mf();
Qt中遇到如下警告 warning: delete called on non-final 'xxx' that has virtual functions but non-virtual destructor 因为类中有纯虚函数。 只要纯虚函数, 就必须要虚析构函数。 所以解决办法就是在原类中定义虚析构函数
Core concepts of OOP(Object-oriented programming): abstraction, encapsulation, inheritance and polymorphism. Inheritance Syntax Single inheritance: class derived-class:...
报错如下: libcaffe.so: undefined reference to `non-virtual thunk to caffe::BasePrefetchingDataLayer<double>::InternalThreadEntry() 解决办法: 之前使用的命令是: make clean              make  -j   40 这个问题的出现...
在c++中,虚函数也是很重要的一部分。接下来对non-virtual函数virtual函数和pure virtual函数进行区分。主要应用在class中,通知需要通过子类对父类继承时使用,通常有接口继承和实现继承nonvirtual函数,即不是虚函数函数,它不希望子类重新定义(override)此函数。也就是提供接口继承,并强制性实现继承virtual函数,希望子类去重新定义函数,并该函数在父类有已有默认定义。既可以直接继承父类实现,也可以子类自己定义。提供接口继承,对于实现继承不强制。
区分接口继承和实现继承 本篇主要讨论pure virtual函数(纯虚函数),impure virtual函数(虚函数),以及non-virtual函数(非虚函数)的实际意义. 概念上通过public继承,实际上可以分为函数接口继承(function interfaces)和函数实现继承(funcion implementations). 考虑下面这个例子 class Shape{ public:...
undefined reference to `OpenDDS::DCPS::DataWriterImpl::control_delivered(std::unique_ptr<ACE_Message_Block, OpenDDS::DCPS::Message_Block_Deleter> const&)' undefined reference to `OpenDDS::DCPS::DataWriterImpl::control_dropped(std::unique_ptr<.