- 浏览: 2054295 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (795)
- java (263)
- 聚类搜索引擎 (9)
- 经验之谈 (67)
- DSP (3)
- C++ (140)
- Linux (37)
- SNMP (6)
- Python (6)
- 数据库 (61)
- 网络 (20)
- 算法 (15)
- 设计模式 (4)
- 笔试题 (38)
- 散文 (35)
- 数据结构 (9)
- 银行知识 (0)
- 榜样 (9)
- Lucene (15)
- Heritrix (6)
- MetaSeeker (0)
- netbeans (12)
- php (3)
- 英语 (8)
- DB2 (0)
- java基础 (5)
- mongodb & hadoop (4)
- Javascript (7)
- Spring (4)
- ibatis & myibatis (1)
- velocity (1)
- 微服务 (0)
- paddle (1)
- 第三方 (0)
- 知识沉淀 (1)
- 建模 (0)
最新评论
-
0372:
标示对java很陌生!
中文乱码解决的4种方式 -
梦留心痕:
Java中\是转意字符, 可是你的这句话我没看懂,只要把得到的 ...
java中如何忽略字符串中的转义字符--转载 -
yanjianpengit:
[b][/b]
java为什么非静态内部类里面不能有静态成员 -
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
eclipse 如何把java项目转成web项目 -
qq1130127172:
,非常好。
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
private继承的话,原来父类的public ,protected成员继承到子类中,并成为private类型成员;
protected继承的话,原来父类的public ,protected成员继承到子类中,并成为protected类型成员;
public继承的话,原来父类的public ,protected成员继承到子类中,类型不变
本文目录
如何表达“私有继承”
“私有继承”和“组合(Composition)”如何相似
我应该优先使用“组合(Composition)”还是“私有继承”
我是否应该把一个私有继承类的指针转化为基类指针
“保护继承”与“私有继承”具有哪些相关性
“私有继承”和“保护继承”有什么使用规则
如何表达“私有继承”
继承时使用 private 关键字,而不是 public。例如:
class Foo : private Bar {
public:
...
};
“私有继承”和“组合(Composition)”如何相似
私有继承是组合(Composition)的一个语法表达上的变种。例:
Car Has-A Engine 这种关系用简单的组合可以表达为:
class Engine {
public:
Engine(int numCylinders);
void start(); // Starts this Engine
};
class Car {
public:
Car() : e_(8) { } // Initializes this Car with 8 cylinders
void start() { e_.start(); } // Start this Car by starting its Engine
private:
Engine e_; // Car has-a Engine
};
它还可以使用私有继承来表达:
class Car : private Engine { // Car has-a Engine
public:
Car() : Engine(8) { } // Initializes this Car with 8 cylinders
using Engine::start; // Start this Car by starting its Engine
};
以上两个方案有一些相似之处:
在两个方案里,每个 Car 对象都仅拥有一个 Engine 对象。
客户都无法将 Car* 转换为 Engine*。
两个方案里的 Car 类都有一个 start() 方法用来调用包含的 Engine 对象的 start() 方法。
也有一些不同之处:
当你打算让每个 Car 拥有多个 Engine 时,你需要使用组合(Composition)。
私有继承会引入不必要的多重继承。
私有继承允许成员将 Car* 转换为 Engine*。
私有继承允许访问基类的 protected 成员。
私有继承允许 Car 重载 Engine 的虚函数。
私有继承使得 Car 拥有 start() 方法稍稍简单一些(简单地调用 Engine 的 start() 即可)。
需要注意的是,私有继承通常会用来获得对基类的 protected 成员的访问权,但这并不是一个长远的解决方案。
我应该优先使用“组合(包含)”还是“私有继承”
尽量使用组合,必要时才使用私有继承。
一般情况下,你并不需要访问太多其它类的内部,私有继承就给了你这样的一种能力以及责任。但私有继承并不 evil,只是它的维护过于昂贵,因为它把某人更改了某个东西导致破坏掉你的代码的可能性提高了。
私有继承的一个正统的、长远的使用方法是:当你打算建立一个class Fred 使用 class Wilma 的代码,并且 class Wilma 的代码需要调用你的新类 class Fred 的成员函数。在这种情况下,Fred 调用 Wilma 的 non-virtual 函数,Wilma 调用自身的 pure virtual 函数(它们在 Fred 中被重载)。使用组合很难实现这个目的。
class Wilma {
protected:
void fredCallsWilma()
{
std::cout <<"Wilma::fredCallsWilma()\n";
wilmaCallsFred();
}
virtual void wilmaCallsFred() = 0; // A pure virtual function
};
class Fred : private Wilma {
public:
void barney()
{
std::cout <<"Fred::barney()\n";
Wilma::fredCallsWilma();
}
protected:
virtual void wilmaCallsFred()
{
std::cout <<"Fred::wilmaCallsFred()\n";
}
};
我是否应该把一个私有继承类的指针转换为基类指针
一般来说,不应该。
从私有继承类的成员函数和友员函数来看,派生类与基类的关系是已知的。将 PrivatelyDer* 向上转化为 Base*(或者是 PrivatelyDer& 到 Base&)是安全的,不需要也不建议使用转换。
尽管如此,用户应该避免这种行为。当这种转换是私有继承类的 private 行为时,转换没有任何通知。
“保护继承”与“私有继承”具有哪些相关性
相似点:都允许重载虚函数。都不代表与基类是 Is-A 的关系。
不同点:保护继承允许子类的子类知道继承关系,孙子类实际上暴露有实现细节。这样既有好处,也有代价。好处是孙子类可以利用它与基类的关系。代价是如果子类不潜在地打破进一步派生的类,它就无法改变这种关系。(我翻译地实在太汗了,贴上原文吧:This has both benefits (it allows derived classes of the protected derived class to exploit the relationship to the protected base class) and costs (the protected derived class can't change the relationship without potentially breaking further derived classes). )
“私有继承”和“保护继承”有什么使用规则
拿下面的这几个类为例:
class B { /*...*/ };
class D_priv : private B { /*...*/ };
class D_prot : protected B { /*...*/ };
class D_publ : public B { /*...*/ };
class UserClass { B b; /*...*/ };
没有一个派生类可以访问 B 的 private 部分。
在 D_priv 中,B 的 public 和 protected 部分是 private 的。
在 D_prot 中,B 的 public 和 protected 部分是 protected 的。
在 D_publ 中,B 的 public 部分是 public,protected 部分是 protected,因为 D_publ Is-A B。
UserClass 仅可访问 B 的 public 部分,因为 B 对内部实现进行了封装。
要让 B 的 public 方法在 D_priv 或 D_prot 中也是 public,需要使用 B:: 前缀,例:让 B::f(int, float) 方法在 D_prot 也是 public,应该写为:
class D_prot : protected B {
public:
using B::f; // Note: Not using B::f(int,float)
};
protected继承的话,原来父类的public ,protected成员继承到子类中,并成为protected类型成员;
public继承的话,原来父类的public ,protected成员继承到子类中,类型不变
本文目录
如何表达“私有继承”
“私有继承”和“组合(Composition)”如何相似
我应该优先使用“组合(Composition)”还是“私有继承”
我是否应该把一个私有继承类的指针转化为基类指针
“保护继承”与“私有继承”具有哪些相关性
“私有继承”和“保护继承”有什么使用规则
如何表达“私有继承”
继承时使用 private 关键字,而不是 public。例如:
class Foo : private Bar {
public:
...
};
“私有继承”和“组合(Composition)”如何相似
私有继承是组合(Composition)的一个语法表达上的变种。例:
Car Has-A Engine 这种关系用简单的组合可以表达为:
class Engine {
public:
Engine(int numCylinders);
void start(); // Starts this Engine
};
class Car {
public:
Car() : e_(8) { } // Initializes this Car with 8 cylinders
void start() { e_.start(); } // Start this Car by starting its Engine
private:
Engine e_; // Car has-a Engine
};
它还可以使用私有继承来表达:
class Car : private Engine { // Car has-a Engine
public:
Car() : Engine(8) { } // Initializes this Car with 8 cylinders
using Engine::start; // Start this Car by starting its Engine
};
以上两个方案有一些相似之处:
在两个方案里,每个 Car 对象都仅拥有一个 Engine 对象。
客户都无法将 Car* 转换为 Engine*。
两个方案里的 Car 类都有一个 start() 方法用来调用包含的 Engine 对象的 start() 方法。
也有一些不同之处:
当你打算让每个 Car 拥有多个 Engine 时,你需要使用组合(Composition)。
私有继承会引入不必要的多重继承。
私有继承允许成员将 Car* 转换为 Engine*。
私有继承允许访问基类的 protected 成员。
私有继承允许 Car 重载 Engine 的虚函数。
私有继承使得 Car 拥有 start() 方法稍稍简单一些(简单地调用 Engine 的 start() 即可)。
需要注意的是,私有继承通常会用来获得对基类的 protected 成员的访问权,但这并不是一个长远的解决方案。
我应该优先使用“组合(包含)”还是“私有继承”
尽量使用组合,必要时才使用私有继承。
一般情况下,你并不需要访问太多其它类的内部,私有继承就给了你这样的一种能力以及责任。但私有继承并不 evil,只是它的维护过于昂贵,因为它把某人更改了某个东西导致破坏掉你的代码的可能性提高了。
私有继承的一个正统的、长远的使用方法是:当你打算建立一个class Fred 使用 class Wilma 的代码,并且 class Wilma 的代码需要调用你的新类 class Fred 的成员函数。在这种情况下,Fred 调用 Wilma 的 non-virtual 函数,Wilma 调用自身的 pure virtual 函数(它们在 Fred 中被重载)。使用组合很难实现这个目的。
class Wilma {
protected:
void fredCallsWilma()
{
std::cout <<"Wilma::fredCallsWilma()\n";
wilmaCallsFred();
}
virtual void wilmaCallsFred() = 0; // A pure virtual function
};
class Fred : private Wilma {
public:
void barney()
{
std::cout <<"Fred::barney()\n";
Wilma::fredCallsWilma();
}
protected:
virtual void wilmaCallsFred()
{
std::cout <<"Fred::wilmaCallsFred()\n";
}
};
我是否应该把一个私有继承类的指针转换为基类指针
一般来说,不应该。
从私有继承类的成员函数和友员函数来看,派生类与基类的关系是已知的。将 PrivatelyDer* 向上转化为 Base*(或者是 PrivatelyDer& 到 Base&)是安全的,不需要也不建议使用转换。
尽管如此,用户应该避免这种行为。当这种转换是私有继承类的 private 行为时,转换没有任何通知。
“保护继承”与“私有继承”具有哪些相关性
相似点:都允许重载虚函数。都不代表与基类是 Is-A 的关系。
不同点:保护继承允许子类的子类知道继承关系,孙子类实际上暴露有实现细节。这样既有好处,也有代价。好处是孙子类可以利用它与基类的关系。代价是如果子类不潜在地打破进一步派生的类,它就无法改变这种关系。(我翻译地实在太汗了,贴上原文吧:This has both benefits (it allows derived classes of the protected derived class to exploit the relationship to the protected base class) and costs (the protected derived class can't change the relationship without potentially breaking further derived classes). )
“私有继承”和“保护继承”有什么使用规则
拿下面的这几个类为例:
class B { /*...*/ };
class D_priv : private B { /*...*/ };
class D_prot : protected B { /*...*/ };
class D_publ : public B { /*...*/ };
class UserClass { B b; /*...*/ };
没有一个派生类可以访问 B 的 private 部分。
在 D_priv 中,B 的 public 和 protected 部分是 private 的。
在 D_prot 中,B 的 public 和 protected 部分是 protected 的。
在 D_publ 中,B 的 public 部分是 public,protected 部分是 protected,因为 D_publ Is-A B。
UserClass 仅可访问 B 的 public 部分,因为 B 对内部实现进行了封装。
要让 B 的 public 方法在 D_priv 或 D_prot 中也是 public,需要使用 B:: 前缀,例:让 B::f(int, float) 方法在 D_prot 也是 public,应该写为:
class D_prot : protected B {
public:
using B::f; // Note: Not using B::f(int,float)
};
发表评论
-
DLL中导出函数的声明有两种方式:
2012-11-12 16:42 1888DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中 ... -
k-means算法的C++实现
2011-04-05 11:38 2353k-means算法的C++实现: http://www.ku ... -
main()中的参数
2010-10-31 10:41 1550所有的应用程序都是从以main函数作为入口, 而mai ... -
static作用
2010-10-26 19:15 2405转自(from http://www.cnb ... -
mmap函数
2010-10-25 22:41 1925mmap函数的使用方法 UNIX ... -
C语言中三种内存分配方式
2010-10-25 20:23 01.malloc 原型:extern void *ma ... -
位拷贝和值拷贝
2010-10-23 15:37 1614为了便于说明我们以String类为例: 首先定义String ... -
(转帖)把类的析构函数写成虚函数的用意
2010-10-23 15:10 1712#include <iostream.h> cl ... -
动态规划/贪心算法----0/1背包问题AND普通背包问题
2010-10-23 14:03 6839两个背包问题都是比较典型的问题,对这两种算法的理解有很好的帮助 ... -
netstat, nslookup, finger, ping命令
2010-10-22 17:13 1559Netstat用于显示与IP、TCP ... -
C++返回值
2010-10-22 16:53 1588C++函数返回值: (1)正常情况下,函数的参数要复制一份在 ... -
switch语句后的表达式的值
2010-10-22 16:23 1856一般格式: switch (表达式) { case 常量 ... -
C++四种强制类型转换
2010-10-19 11:45 1586显式类型转换又被称之 ... -
C++四种强制类型转化的区别
2010-10-19 11:43 1368先介绍const_cast和reinterpret_cast: ... -
Visual C++线程同步技术剖析:临界区,时间,信号量,互斥量
2010-10-18 14:24 1843使线程同步 在程序中使用多线程时,一般很少有多个线程能在其 ... -
(转)临界区,互斥量,信号量,事件的区别
2010-10-18 14:22 1783四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行 ... -
(转)在C++中实现同步锁,类似synchronize(object){....}
2010-10-18 13:49 1896在做C++的项目中发现, ... -
C++线程同步
2010-10-18 13:46 1630线程同步是多 ... -
C++多线程编程
2010-10-18 10:56 1764今天我给大家讲一讲C++ ... -
关于C++对函数传参与函数返回值进行引用传递的详解
2010-10-16 22:51 4076关于C++对函数传参与函数返回值进行引用传递的详解 ...
相关推荐
C++提供了三种不同的继承方式,每种方式对基类成员的访问权限有不同的规定,分别是公有继承(public inheritance)、保护继承(protected inheritance)和私有继承(private inheritance)。 1. 公有继承(public ...
C++中public继承、private继承、protected继承的例子
C++ 提供了三种继承方式:公有继承(public inheritance)、保护继承(protected inheritance)和私有继承(private inheritance),每种方式都有不同的访问权限和行为。 1. **公有继承(Public Inheritance)** -...
在C++中,继承方式有三种:公有继承、私有继承和保护继承。 公有继承是指基类中的公有成员和保护成员在派生类中仍然是公有成员和保护成员。基类中的私有成员在派生类中不可访问。公有继承的优点是可以继承基类的...
本节课程主要介绍C++中继承与派生的概念和使用方法,包括公有继承、私有继承和保护继承等不同的继承方式。通过实验和实践,掌握继承与派生的基本概念和使用方法。 继承的概念 继承是面向对象编程中的一种机制,它...
继承方式主要有三种:公有继承(public inheritance)、私有继承(private inheritance)和保护继承(protected inheritance)。在公有继承下,基类的公有和保护成员在派生类中保持相同访问级别;私有继承则使基类的...
在继承方面,C++提供了多种继承方式,包括单继承、多重继承和虚继承。每种继承方式都对应着不同的内存布局。例如,在单继承中,子类的成员变量和基类的成员变量会被合并到一起。在多重继承中,每个基类的成员变量...
继承方式有三种:公有、私有和保护。多继承中,多个基类具有同名成员,在它们的子类中访问这些成员,就产生了二义性,但进行访问时,不能存在二义性。赋值兼容规则是指派生类对象可以当作基类对象使用,只要存在继承...
- **私有继承(private)**:基类的公有和保护成员在子类中变为私有。 - **保护继承(protected)**:基类的公有成员在子类中变为保护,保护成员保持不变。 4. **虚函数与多态** - **虚函数(virtual function)...
C++类的私有继承 在声明一个派生类时将基类的继承方式指定为private的,称为私有继承,用私有继承方式建立的派生类称为私有派生类(private derived class ), 其基类称为私有基类(private base class )。 私有基类的...
C++ 中私有继承的作用 私有继承的 第一个规则:和公有继承相反,如果两个类之间的继承关系为私有,编译器一般不会将派生类对象转换成基类对象。 第二个规则: 从私有基类继承而来的成员都成为了派生类的私有成员,...
- **私有继承(private)**:基类的所有成员在派生类中都被视为私有,包括原本的公有和保护成员。派生类内部可以访问基类的公有和保护成员,但外部代码不能直接访问基类的任何成员。 - **保护继承(protected)**...
私有继承通常用来表示“is-implemented-in-terms-of”关系,即派生类是用基类实现的,但并不表示“is-a”关系。 5.4.3 保护成员和保护继承(Protected Inheritance) 保护继承方式下,基类的公有和保护成员在派生类...
C++支持三种不同的继承方式:私有继承、保护继承和公有继承。每种继承方式都会影响到派生类成员以及通过派生类对象访问基类成员的权限。 1. **私有继承(Private Inheritance)** - 私有继承将基类中的公有和保护...
- **私有继承**:父类的公有成员和保护成员在子类中变为私有成员。 #### 继承的语法 在C++中,定义继承的语法非常直接,形式如下: ```cpp class 派生类名 : 继承方式 基类名 { 新增成员声明; }; ``` 其中,...
继承可以分为公有继承、私有继承和保护继承三种,分别对应基类成员的访问权限。公有继承中,基类的公有成员和保护成员在派生类中保持不变;私有继承中,基类的所有成员在派生类中变为私有成员;保护继承中,基类的...
6. 继承中的访问控制:解释公有继承、保护继承和私有继承的区别,以及它们对子类访问权限的影响。 7. 小结和最佳实践:总结继承的使用场景,提供关于何时以及如何使用继承的最佳实践。 通过学习这个视频教程,你将...
私有继承下,基类的公有和保护成员在派生类中将变为私有;而保护继承则使得基类的公有成员在派生类中变为保护成员。 #### 5.2 派生类的构造函数和析构函数 派生类的构造函数需要调用基类的构造函数来初始化继承自...