2010-07-24 137 views
1

我在想,如果以下是可能的:可以这样做吗?

class foo 
{ 
    virtual void bar(); 
} 

class izy : public foo 
{ 
int a; 
virtual void bar() 
{ 
    a = 2; 
} 
} 

foo *anyfoo = new izy; 
anyfoo.bar(); 

基本上就是我想知道的是,我可以添加变量或会是因为它不是基类的foo部分不存在的?

+4

<流鼻涕的注释>在你比如你不能叫'bar'因为)它是私有&B)您使用了错误的语法通过指针调用方法的对象... 2010-07-24 18:52:40

+0

[获取一本书,找出](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 :) – GManNickG 2010-07-24 18:53:44

+0

问题的标题很弱,通用,制定得不好。这样的标题最受社区关注。做得很好!在不到20分钟内就能看到60多个视图。 – karlphillip 2010-07-24 19:06:53

回答

3

是的,你可以在子类中添加新的变量和方法。

1

继承允许派生类中的新变量。你试图实现的是多态性,在这种情况下通过使用指向基类类型的指针来防止这种情况。

1

在您的代码中,您将拨打foo::bar()。要调用将修改aizy::bar)的函数,您应该使bar为虚拟。


你做了之后bar虚拟代码将改变a如果你移动barpublic部分。 anyfoo指向izy类的实例,其中包含a

1

随着你的代码,它不会按你的想法工作,因为foobar将被调用,而不是izy的酒吧。如果将bar更改为虚拟,则它将按预期工作。 a只存在于izy类中不是问题。

+0

但实例是izy实例。它将覆盖最初的方法。 – mhshams 2010-07-24 18:50:08

+2

@mohammad:但指针的类型为'foo *',它从等式中删除了有关'izy'的任何内容。如果该函数被标记为“虚拟”,则会按预期得到多态行为。编辑:当然,这个问题现在编辑,包括虚拟。 – GManNickG 2010-07-24 18:51:39

+1

@mohammadshamsi:只覆盖虚拟函数。如果你定义了两个具有相同名称的非虚函数,那么你不会得到多态,你只会得到两个同名的函数。如果通过基类指针访问非虚函数,则将调用基类的函数。 – sepp2k 2010-07-24 18:55:09

0

是的,你可以添加新的属性,如函数和variables.Inheritance允许你使用父类的公共和受保护的属性。您也可以像bar()函数一样读取这些属性。

感谢

0

我可以添加变量或会是因为它不是基类的foo部分不存在的?

其他答案还没有完全说明:你的变量不是foo,你有一个foo*。这是指向其他一些不确定大小的内存区域的指针。所以你没有限制存储大小的foo所以是的,你可以有任何额外的存储量。

如果您分配您的变量作为foofoo存储你不能在更多的鞋拔子,即

foo anyFoo; 
((bar*)(&anyFoo))->bar(); 

将无法​​正常工作。