假设我告诉你,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中,通知需要通过子类对父类
继承时使用,通常有接口
继承和实现
继承。
non—
virtual函数,即不是虚
函数的
函数,它不希望子类
重新定义(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<.