时间:2021-05-20
C++继承可以是单一继承或多重继承,每一个继承连接可以是public,protected,private也可以是virtual或non-virtual。然后是各个成员函数选项可以是virtual或non-virtual或pure virtual。本文仅仅作出一些关键点的验证。
public继承,例如下:
1 class base
2 {...}
3 class derived:public base
4 {...}
如果这样写,编译器会理解成类型为derived的对象同时也是类型为base的对象,但类型为base的对象不是类型为derived的对象。这点很重要。那么函数形参为base类型适用于derived,形参为derived不适用于base。下面是验证代码,一个参数为base的函数,传入derived应该成功执行,相反,一个参数为derived的函数
运行结果为:
base:baseName is test, baseData is 10
base:baseName is btest, baseData is 5
下面改改代码,将函数参数变为derived
void show2(std::string& info,const derived& d){ info.append("Name is "); info.append(d.getBaseName()); info.append(", baseData is "); char buffer[10]; sprintf(buffer,"%d",d.getBaseData()); info.append(buffer);}调用show(ss,d);编译器报错
1 derived_class.cpp: In function `int main(int, char**)':2 derived_class.cpp:84: error: invalid initialization of reference of type 'const derived&' from expression of type 'base'3 derived_class.cpp:70: error: in passing argument 2 of `void show2(std::string&, const derived&)'第二点对各种形式的继承作出验证,首先给出表格
继承方式\成员类型 public protected private public public protected 无法继承 protected protected protected 无法继承 private private private 无法继承
这里解释一下,这里仅仅表达基类的成员,被public,protected,private三种方式继承后,在原基类为public,protectedc,private的成员在继承类里类型为表格里内容
class base{ public: std::string testPublic() { return std::string("this is public base"); } protected: std::string testProtected() { return std::string("this is protected base"); } private: std::string testPrivate() { return std::string("this is private base"); }};class derivedPublic:public base{ public: std::string testPubPublic() { return testPublic()+= "in derived"; } std::string testProPublic() { return testProtected()+= "in derived"; } std::string testPriPublic() { return testPrivate()+= "in derived"; }};int main(int argc,char* argv[]){ derivedPublic dpub; std::cout << dpub.testPublic() << std::endl; }报下面错误,说明testPrivate()不是derived私有函数而是base的私有函数
derived11.cpp:16: error: `std::string base::testPrivate()' is privatederived11.cpp:36: error: within this context这样验证private类型成员无法被继承(public,private,protected)注:private,protected略去不做证明
下面只要验证 testProtected 能被第三层继承类继承,但是无法被第三层类直接调用就说明是public继承后继承类型为protected,而基类为Public类型成员则即可被继承又可以直接调用。
#include <iostream>#include <string>class base{ public: std::string testPublic() { return std::string("this is public base"); } protected: std::string testProtected() { return std::string("this is protected base"); } private: std::string testPrivate() { return std::string("this is private base"); }};class derivedPublic:public base{ public: std::string testPubPublic() { return testPublic()+= "in derived"; } std::string testProPublic() { return testProtected()+= "in derived"; } // std::string testPriPublic() // { // return testPrivate()+= "in derived";// }};class deepDerived:public derivedPublic{ public: std::string deepProtected() { return testProtected() +="in deep"; } std::string deepPublic() { return testPublic() +="indeep"; }};int main(int argc,char* argv[]){ derivedPublic dpub; std::cout << dpub.testProtected() << std::endl; deepDerived deepdpub; std::cout<<deepdpub.testPublic() <<std::endl; std::cout<<deepdpub.testProtected() <<std::endl; std::cout<<deepdpub.deepProtected() <<std::endl; std::cout<<deepdpub.deepPublic() <<std::endl;}这里服务器报错
derived12.cpp:13: error: `std::string base::testProtected()' is protectedderived12.cpp:62: error: within this context这样就验证了一个是public,一个是protected,protected是不能直接调用的,但是被继承后是可以被public成员调用的。
下面的已经证明,详细步骤就略去如果对该部分验证感兴趣,可以看下面代码。
以上就是对C++ j继承的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C++类中的继承实例详解实例效果:实现代码:#include#includeusingnamespacestd;classPerson{public:Perso
C++类继承之子类调用父类的构造函数的实例详解父类HttpUtil:#pragmaonce#include#includeusingnamespacestd;c
C++前置声明详解及实例【1】一般的前置函数声明见过最多的前置函数声明,基本格式代码如下:#includeusingnamespacestd;voidfun(c
C++中回调函数及函数指针的实例详解如何获取到类中函数指针实现代码://A类与B类的定义classA{public:voidTest(){cout
C++静态成员的类内初始化详解及实例代码一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++静态成员的"类内初始化"那就容易迷糊了。我