讨论一下从父类扩展和从子类扩展的作用!每个好的复帖最少给50分!

solotony 2003-08-28 04:28:37
知道已经有这样的的继承体系,其中成员可以任意,但是确定后不可修改
class Base{};
template <typename T> class Sub{};
typedef Sub<Base> TagertClass;

一.通过定义:
class MyClass : public Base{};
typedef Sub<MyClass> TagertClass;

二.通过定义
class MyClass : Sub<Base>{};
typedef MyClass TagertClass;

在Base和Sub定义后就不修改的情况下,通过两种方式定义MyClass对
TagertClass行为的有何影响? 略举代码说明为好

<Up者无效>
...全文
4 点赞 收藏 6
写回复
6 条回复
oopig 2003年08月28日
java也支持继承体系中访问许可的扩大。我觉得没有什么必要去做这方面的限制。
回复 点赞
solotony 2003年08月28日
实验中不幸的发现,一直的认识是错误的!:
1.访问许可,子类扩展中访问许可只能缩小,即public- >protected- >private
子类的扩展中访问许可是可以扩大的.
如下例:

#include "stdio.h"
class MyClass
{
public:
virtual void Handle(){ printf("MyClass"); }
};

class Sub: public MyClass
{
protected:
virtual void Handle(){ printf("sub");}
};

class Sub2: public Sub
{
public:
virtual void Handle(){ printf("sub2");}
};

int main(int argc, char* argv[])
{
Sub2 s;
dynamic_cast<MyClass&>(s).Handle();
return 0;
}

为C++哀悼中....
回复 点赞
solotony 2003年08月28日
我完全同意oopig(面向对象的猪)的观点.

补充几点:
1.访问许可,子类扩展中访问许可只能缩小,即public->protected->private
3.类型TargeClass = Sub<Myclass> 继承自MyClass:Base,还是具有MyClass的行为

50分另帖来领!

回复 点赞
oopig 2003年08月28日
3.类的类型不一样(is a ...)

如果
class MyClass : public Base{};
typedef Sub<MyClass> TagertClass;
其中TargetClass不是MyClass和Base的子类,不具有MyClass和Base的行为特征。


class MyClass : Sub<Base>{};
typedef MyClass TagertClass;
那么TagertClass就是MyClass,自然具有MyClass的行为特征。

回复 点赞
oopig 2003年08月28日
对于TagetClass的行为还是有可能有影响。
1.函数的访问许可可能改变
2.调用的函数实现可能改变

class MyClass
{
public:
virtual void Handle() {}
};

template <typename T>
class Sub
{
private:
virtual void Handle() {}
};

那么
class MyClass : public Base{};
typedef Sub<MyClass> TagertClass;
TargetClass的Handle()实际上是Sub::Handle(),而且访问许可是private

class MyClass : Sub<Base>{};
typedef MyClass TagertClass;
TargetClass的Handle()实际上是MyClass::Handle(),访问许可是public
回复 点赞
oopig 2003年08月28日
对于TagetClass的行为是没有什么影响,但是对于MyCalss的实现和布局是有影响。
吃完饭继续说。
回复 点赞
发动态
发帖子
工具平台和程序库
创建于2007-09-28

8236

社区成员

2.7w+

社区内容

C/C++ 工具平台和程序库
社区公告
暂无公告