这篇文章要写的是c++的继承机制。
c++的类里面的三种函数,第一种是pure virtual function(纯虚函数),第二种是virtual function(虚函数),第三种是non-virtual function(非虚函数)。在设计一个类的时候,(尤其是基类的时候)要考虑设计的函数,要写成什么类型。
纯虚函数:派生类只继承接口
虚函数:派生类可以继承接口和一个默认的实现
非虚函数:派生类继承基类的一个强制的实现
(from 《effective c++》)
下面分别举几个例子:
纯虚函数:
class Base_PureVirtualFunction {public : virtual void print() = 0;
};class Derived_PureVirtualFunction:public Base_PureVirtualFunction {public: void print() { cout << "derived " << endl;
}
};int main() { //Base_PureVirtualFunction b;// 错误,没有办法创建含有纯虚函数的对象,因为纯虚函数没有相应的实现
Derived_PureVirtualFunction d;
d.print() return 0;
}纯虚函数的作用是 只希望派生类继承基类的接口,然后去根据派生类的情况,去给他一个实现。
虚函数
class Base_VirtualFunction {public: virtual void print() { cout << "base" << endl;
}
};class Drived_VirtualFunction:public Base_VirtualFunction {public: void print() { cout << "derived" << endl;
}
};int main() { //demo2
Base_VirtualFunction b;
b.print(); //输出base
Drived_VirtualFunction d;
d.print(); //输出derived
b = d;
b.print(); //输出base
// 关于虚函数的另外一个知识点,动态联编
// 动态联编 只有指针和引用有效
Base_VirtualFunction *b1 = &d;
b1->print(); //输出derived
Base_VirtualFunction &b2 = d;
b2.print(); //输出derived
system("pause"); return 0;
}虚函数的机制是,基类向派生类提供一个接口和默认的实现,派生类可以根据情况,自己定义符合自身的实现,也可以调用基类的默认的实现。这里还有关于虚函数的另外一个知识点,动态联编,重点不在这里,就不解释了。
非虚函数
class Base_NonVirtualFunction {public: void print() { cout << "non virtual function " << endl;
}
};class Drived_NonVirtualFunction :public Base_NonVirtualFunction {public : void other_print() { cout << "other " << endl;
}
};int main(){
Base_NonVirtualFunction b;
b.print(); //输出non virtual function
Drived_NonVirtualFunction d;
d.print(); // 输出non virtual function
d.other_print(); //输出other}对于非虚函数:
1 . 派生类其实继承了基类的所有函数的数据成员
2 . 非虚函数的作用是基类给派生类的一个强制性实现的函数
3 . 对于一个基类给派生类的一个强制性实现的函数,派生类也可以重新定义一个相同名字的函数,不过这样就是覆盖了。派生类的函数会覆盖掉基类的函数。
一个新的例子:
class Base_NonVirtualFunction {public: void print() { cout << "non virtual function " << endl;
}
};class Drived_NonVirtualFunction :public Base_NonVirtualFunction {public : void other_print() { cout << "other " << endl;
} //和子类同名的函数
void print() { cout << " derived" << endl;
}
};int main(){
Base_NonVirtualFunction b;
b.print(); //输出non virtual function
Drived_NonVirtualFunction d;
d.print(); //输出 derived
d.other_print(); //输出 other}这里想强调的是,无论是自己在设计类的时候,还是在看别人的代码的时候,首先应该注意一下:
作者:zhaozhengcoder
链接:https://www.jianshu.com/p/c6939fcc5bf4
热门评论
-
慕标22774072019-05-28 0
查看全部评论好乱
看不清
真的好乱
!