C++之继承 继承是面向对象的三大特性之一 通过继承的方式派生类获得基类的共性。 基本语法:单继承
class derived-class: access-specifier base-class
#include <iostream>
using namespace std;
class Animal
{public:
void eat()
{
cout << "eat" << endl;
}
void sleep()
{
cout << "sleep" << endl;
}
};
class Dog :public Animal
{
public:
void bark()
{
cout << "bark" << endl;
}
};
class Cat :public Animal
{
public:
void miaomiao()
{
cout << "miaomiao" << endl;
}
};
void test()
{
Dog dog;
Cat cat;
dog.bark(); dog.eat(); dog.sleep();
cat.miaomiao(); cat.eat(); cat.sleep();
}
int main()
{
test();
system("pause");
return 0;
}
多继承,可以修改为:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};
例子如下:
#include <iostream>
using namespace std;
class Animal1
{public:
void eat()
{
cout << "eat" << endl;
}
};
class Animal2
{
public:
void sleep()
{
cout << "sleep" << endl;
}
};
class Dog :public Animal1,public Animal2
{
public:
void bark()
{
cout << "bark" << endl;
}
};
class Cat :public Animal1,public Animal2
{
public:
void miaomiao()
{
cout << "miaomiao" << endl;
}
};
void test()
{
Dog dog;
Cat cat;
dog.bark(); dog.eat(); dog.sleep();
cat.miaomiao(); cat.eat(); cat.sleep();
}
int main()
{
test();
system("pause");
return 0;
}
C++中多继承不常用,当父类中出现同名成员时,容易出现二义性。此时需要提价基类的作用域。 继承的方式一共有三种 1.公共继承 2.保护继承 3.私有继承 class A :public B 基类的私有继承,不可继承,公共继承以及保护继承不变 class A :protected B 基类的私有继承,不可继承,公共继承变为保护继承,保护继承不变 class A :private B 基类的私有继承,不可继承,公共继承与保护继承变为私有继承 父类中的所有非静态成员属性都会被子类继承下来。但是编译器对基类中的私有成员变量被隐蔽。无法访问。但是确实被继承下来了。 案例: 测试如下,整型为4个字节,基类中有三个整型,派生类中有一个。测试结果显示为16
#include <iostream>
using namespace std;
class Base
{public:
int a;
protected:
int b;
private:
int c;
};
class Son :private Base
{
public:
int d;
};
void test()
{
Son son;
cout << " SON = " << sizeof(son)<<endl;
}
int main()
{
test();
system("pause");
return 0;
}
使用VS2017的开发人员命令提示符,报告单个类的样式,或得如下结果,结果显示证明上述。 继承同名成员处理方式 处理问题:当子类与父类出现同名的成员,访问子类或者父类中同名的数据 1.访问子类同名成员,直接访问。 2.访问父类同名成员,需要加作用域。 原因:子类的成员函数会隐藏掉父类中的所有同名成员函数,需要加作用域 静态成员和非静态成员,处理方法上是一致的。 example:
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
m_a = 10;
}
int m_a;
};
class Son :public Base
{
public:
Son ( )
{
m_a = 100;
}
int m_a;
};
void test()
{
Son son;
cout << " Son中的大小为: = " << son.m_a<<endl;
cout << " Base中的大小为: = " << son.Base::m_a << endl;
}
int main()
{
test();
system("pause");
return 0;
}
同名成员函数的方法同上,子类的直接访问
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
m_a = 10;
}
void func()
{
cout << "基类中的同名成员函数" << endl;
}
int m_a;
};
class Son :public Base
{
public:
Son ( )
{
m_a = 100;
}
void func()
{
cout << "派生类中的同名成员函数" << endl;
}
int m_a;
};
void test()
{
Son son;
cout << " Son中的大小为: = " << son.m_a<<endl;
cout << " Base中的大小为: = " << son.Base::m_a << endl;
son.func();
son.Base::func();
}
int main()
{
test();
system("pause");
return 0;
}
|