#include "Test.h" #pragma once #include <iostream> #include <atldef.h> using namespace std; class CBse { public: virtual void f1() { cout << "base" << endl; } void f2() { cout << "f2::base" <<endl; } }; class CDerive : public CBse { public: virtual void f1() { cout << "Derive" << endl; } void fun(CBse& pB) { pB.f1(); } void main() { CDerive sD;; fun(sD); system("pause"); }
输出为:Derive
此时若改为:
void fun(CBse pB) { pB.f1(); }输出为base,此时子类对象被切片(sliced)
若在类定义是加上ATL_NO_VTABLE这个宏,则直接报错,因为此时每个类中都没有虚函数表,则虚表指针为空,所以报错