C++继承介绍
然后是各个成员函数选项可以是virtual或non-virtual或purevirtual。本文仅仅作出一些关键点的验证。
public继承,例如下:
classbase
{...}
classderived:publicbase
{...}
如果这样写,编译器会理解成类型为derived的对象同时也是类型为base的对象,但类型为base的对象不是类型为derived的对象。这点很重要。那么函数形参为base类型适用于derived,形参为derived不适用于base。下面是验证代码,一个参数为base的函数,传入derived应该成功执行,相反,一个参数为derived的函数
#include<iostream>
#include<stdio.h>
classbase
{
public:
base()
:baseName(""),baseData(0)
{}
base(std::stringbn,intbd)
:baseName(bn),baseData(bd)
{}
std::stringgetBaseName()const
{
returnbaseName;
}
intgetBaseData()const
{
returnbaseData;
}
private:
std::stringbaseName;
intbaseData;
};
classderived:publicbase
{
public:
derived():base(),derivedName("")
{}
derived(std::stringbn,intbd,std::stringdn)
:base(bn,bd),derivedName(dn)
{}
std::stringgetDerivedName()const
{
returnderivedName;
}
private:
std::stringderivedName;
};
voidshow(std::string&info,constbase&b)
{
info.append("Nameis");
info.append(b.getBaseName());
info.append(",baseDatais");
charbuffer[10];
sprintf(buffer,"%d",b.getBaseData());
info.append(buffer);
}
intmain(intargc,char*argv[])
{
baseb("test",10);
std::strings;
show(s,b);
std::cout<<s<<std::endl;
derivedd("btest",5,"dtest");
std::stringss;
show(ss,d);
std::cout<<ss<<std::endl;
return0;
}
运行结果为:
base:baseNameistest,baseDatais10
base:baseNameisbtest,baseDatais5
下面改改代码,将函数参数变为derived
voidshow2(std::string&info,constderived&d)
{
info.append("Nameis");
info.append(d.getBaseName());
info.append(",baseDatais");
charbuffer[10];
sprintf(buffer,"%d",d.getBaseData());
info.append(buffer);
}
调用show(ss,d);编译器报错
derived_class.cpp:Infunction`intmain(int,char**)":
derived_class.cpp:84:error:invalidinitializationofreferenceoftype"constderived&"fromexpressionoftype"base"
derived_class.cpp:70:error:inpassingargument2of`voidshow2(std::string&,constderived&)"第二点对各种形式的继承作出验证,首先给出表格
这里解释一下,这里仅仅表达基类的成员,被public,protected,private三种方式继承后,在原基类为public,protectedc,private的成员在继承类里类型为表格里内容
classbase
{
public:
std::stringtestPublic()
{
returnstd::string("thisispublicbase");
}
protected:
std::stringtestProtected()
{
returnstd::string("thisisprotectedbase");
}
private:
std::stringtestPrivate()
{
returnstd::string("thisisprivatebase");
}
};
classderivedPublic:publicbase
{
public:
std::stringtestPubPublic()
{
returntestPublic()+="inderived";
}
std::stringtestProPublic()
{
returntestProtected()+="inderived";
}
std::stringtestPriPublic()
{
returntestPrivate()+="inderived";
}
};
intmain(intargc,char*argv[])
{
derivedPublicdpub;
std::cout<<dpub.testPublic()<<std::endl;
}
报下面错误,说明testPrivate()不是derived私有函数而是base的私有函数
derived11.cpp:16:error:`std::stringbase::testPrivate()"isprivate
derived11.cpp:36:error:withinthiscontext这样验证private类型成员无法被继承(public,private,protected)注:private,protected略去不做证明
下面只要验证testProtected能被第三层继承类继承,但是无法被第三层类直接调用就说明是public继承后继承类型为protected,而基类为Public类型成员则即可被继承又可以直接调用。
#include<iostream>
#include<string>
classbase
{
public:
std::stringtestPublic()
{
returnstd::string("thisispublicbase");
}
protected:
std::stringtestProtected()
{
returnstd::string("thisisprotectedbase");
}
private:
std::stringtestPrivate()
{
returnstd::string("thisisprivatebase");
}
};
classderivedPublic:publicbase
{
public:
std::stringtestPubPublic()
{
returntestPublic()+="inderived";
}
std::stringtestProPublic()
{
returntestProtected()+="inderived";
}
// std::stringtestPriPublic()
// {
// returntestPrivate()+="inderived";
// }
};
classdeepDerived:publicderivedPublic
{
public:
std::stringdeepProtected()
{
returntestProtected()+="indeep";
}
std::stringdeepPublic()
{
returntestPublic()+="indeep";
}
};
intmain(intargc,char*argv[])
{
derivedPublicdpub;
std::cout<<dpub.testProtected()<<std::endl;
deepDeriveddeepdpub;
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::stringbase::testProtected()"isprotected
derived12.cpp:62:error:withinthiscontext这样就验证了一个是public,一个是protected,protected是不能直接调用的,但是被继承后是可以被public成员调用的。
下面的已经证明,详细步骤就略去如果对该部分验证感兴趣,可以看下面代码。
#include<iostream>
2#include<string>
3classbase
4{
5 public:
6 std::stringtestPublic()
7 {
8 returnstd::string("thisispublicbase");
9 }
protected:
std::stringtestProtected()
{
returnstd::string("thisisprotectedbase");
}
private:
std::stringtestPrivate()
{
returnstd::string("thisisprivatebase");
}
};
classderivedPublic:publicbase
{
public:
std::stringtestPubPublic()
{
returntestPublic()+="inderived";
}
std::stringtestProPublic()
{
returntestProtected()+="inderived";
}
// std::stringtestPriPublic() //私有成员并没有被继承下来
// {
// returntestPrivate()+="inderived";
// }
};
classdeepDerived:publicderivedPublic
{
public:
std::stringtest()
{
returntestPublic()+="in3";
}
};
classderivedProtected:protectedbase
{
public:
std::stringtestPubProtected()
{
returntestPublic()+="inderived";
}
std::stringtestProProtected()
{
returntestProtected()+="inderived";
}
};
classdeepDerived2:publicderivedProtected
{
public:
std::stringtest()
{
returntestPublic()+="in3";
}
};
classderivedPrivate:privatebase
{
public:
std::stringtestPubPirvate()
{
returntestPublic()+="inderived";
}
std::stringtestProPrivate()
{
returntestProtected()+="inderived";
}
};
//classdeepDerived3:publicderivedPrivate
//{
// public:
// std::stringtest()
// {
// returntestPublic()+="in3";
// }
//};
intmain(intargc,char*argv[])
{
derivedPublicdpub;
//derivedProtecteddpro;
//derivedPrivatedpri;
std::cout<<dpub.testPublic()<<std::endl; //
//std::cout<<dpub.testProtected()<<std::endl; //用户被继承也是无法使用
//cout<<dpub.testPrivate()<<std::endl; //基类都是私有函数
std::cout<<dpub.testPubPublic()<<std::endl;
std::cout<<dpub.testProPublic()<<std::endl;
//std::cout<<dpub.testPriPrivate()<<std::endl;//没有被继承
deepDeriveddd;
std::cout<<dd.test()<<std::endl;
derivedProtecteddpro;
//std::cout<<dpro.testPublic()<<std::endl; //变成protected类型
std::cout<<dpro.testPubProtected()<<std::endl;
std::cout<<dpro.testProProtected()<<std::endl;
deepDerived2dd2;
std::cout<<dd2.test()<<std::endl;
derivedPrivatedpri;
std::cout<<dpri.testPubPirvate()<<std::endl;
std::cout<<dpri.testProPrivate()<<std::endl;
// deepDerived3dd3;
// std::cout<<dd3.test()<<std::endl;
}
相关文章
- C++学习——继承与派生「建议收藏」
- EasyC++74,继承(一)
- EasyC++82,继承和动态内存分配
- java c++ 学哪个_c++和java区别 学哪个比较好
- 【c++】【基础】【primer_plus】【第八章】 引用与模板函数
- C++学生选课系统 【含 代码】
- C++基本概念_c语言 c++区别
- C++ 和 Java 中的默认虚拟行为有何不同及其异常处理的比较
- C++ 菱形继承
- c++的链表-C++链表
- c++标准库
- C++ 最大公约数 Greatest Common Divisor GCD
- 数据结构小记【Python/C++版】——AVL树篇
- 【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )
- 【C++】三大特性之继承
- c++基础篇之C++ 模板
- C++ uniform_real_distribution连续均匀分布类模板用法详解
- C++模板类(类模板)与继承
- C++ break和continue用法详解
- C++模板类继承
- C++ STL关联式容器自定义排序规则(2种方法)
- C++读写Excel的实现方法详解
- C++流操作之fstream用法介绍
- c++版线程池和任务池示例
- C++实现不能被继承的类实例分析