您的位置:首页 > 编程语言 > C语言/C++

C++面向对象程序设计的一些知识点(2)

2013-11-16 09:49 162 查看
1、C++中三种继承方式及派生类中访问控制规则

(1)、C++支持的三种继承方式是public、protected、private。C++允许一个类同时以不同的方式对不同的基类加以继承。

(2)、

不同继承方式下基类成员在派生类中的访问控制

继承方式基类成员访问控制
publicprotectedprivate
publicpublicprotectedno access
protectedprotectedprotectedno access
privateprivateprivateno access

注意:在派生类中,表中所述的访问控制“private”和“no access”存在很大的差别。对来自基类且在派生类中访问控制为“no access”的成员,

在派生类中是不可见的(自然,派生类的外部也不可见);对来自基类且在派生类中访问控制为“private”的子成员,在派生类内部可以访问它

们,但在派生类外部不可以访问它们。

2、派生类对象内存模型分析

(1)、程序运行时派生类对象或存在于函数栈中或存在于系统给程序分配的堆中,它是一段物理内存。

(2)、派生类与基类之间的关系是一种“is-a”的关系,否则在逻辑上必然造成混乱。

()

3、派生类对象的构造过程和析构过程

(1)、在继承方向上,先基类对象,后派生类子对象;在同一层次上,先包含类子对象,再本类子对象;如果在同一层次上存在多个包含类子

对象时,按照声明顺序来构造。

#include <iostream>

using namespace std;

class Employee
{
public:
Employee(char *name)
{
no = companyEmployee++;
grade = 1;
pName = new char[strlen(name) + 1];
strcpy(pName, name);
totalPay = 0.0;
}
~Employee()
{
delete [] pName;
}
public:
void pay(){}
void promote(int increment)
{
grade += increment;
}
void displayInfo(){}
protected:
char *pName;
int no;
int grade;
double totalPay;
static int companyEmployee;
private:
};
int Employee::companyEmployee = 100; // 静态变量初始化

class Technician:public Employee
{
public:
Technician(char *name, int workHours = 0):Employee(name)
{
rate = 100; // 100元/小时
this->workHours = workHours;
}
void setWorkhours(int workHours)
{
this->workHours = workHours;
}
void pay()
{
totalPay = workHours*rate;
}
void displayInfo()
{
promote(2);
cout << "兼职技术人员:" << pName << ",编号:" << no
<< ",级别:" << grade << ",已付本月工资:"
<< totalPay << endl;
}
private:
double rate;
int workHours;
};
class SaleMan:virtual public Employee
{
public:
SaleMan(char *name, int sales = 0):Employee(name)
{
ratio = 0.004;
this->sales = sales;
}
void setSales(double sales)
{
this->sales = sales;
}
void pay()
{
totalPay = sales*ratio;
}
void displayInfo()
{
promote(2);
cout << "推销员:" << pName << ",编号:" << no
<< ",级别:" << grade << ",已付本月工资:"
<< totalPay << endl;
}
protected:
double sales;
double ratio;
};
class Manager:virtual public Employee
{
public:
Manager(char *name, int monthlyPay = 6000):Employee(name)
{
this->monthlyPay = monthlyPay;
}
void setMonthlyPay(double monthlyPay)
{
this->monthlyPay = monthlyPay;
}
void pay()
{
totalPay = monthlyPay;
}
void displayInfo()
{
promote(3);
cout << "经理:" << pName << ",编号:" << no
<< ",级别:" << grade << ",已付本月工资:"
<< totalPay << endl;
}
protected:
double monthlyPay;
};
class SaleManager:public SaleMan, public Manager
{
public:
SaleManager(char *name):SaleMan(name), Manager(name), Employee(name)
{
monthlyPay = 4000;
ratio = 0.002;
}
void pay()
{
totalPay = monthlyPay + sales*ratio;
}
void displayInfo()
{
promote(2);
cout << "销售经理:" << pName << ",编号:" << no
<< ",级别:" << grade << ",已付本月工资:"
<< totalPay << endl;
}
private:
};

int main()
{
Technician t("zhang san");
t.setWorkhours(100);
t.pay();
t.displayInfo();

SaleManager sm("li si");
sm.setMonthlyPay(7000);
sm.setSales(1000);
sm.pay();
sm.displayInfo();
int c;
cin >> c;
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: