我在想,如果以下是可能的:可以这样做吗?
class foo
{
virtual void bar();
}
class izy : public foo
{
int a;
virtual void bar()
{
a = 2;
}
}
foo *anyfoo = new izy;
anyfoo.bar();
基本上就是我想知道的是,我可以添加变量或会是因为它不是基类的foo部分不存在的?
我在想,如果以下是可能的:可以这样做吗?
class foo
{
virtual void bar();
}
class izy : public foo
{
int a;
virtual void bar()
{
a = 2;
}
}
foo *anyfoo = new izy;
anyfoo.bar();
基本上就是我想知道的是,我可以添加变量或会是因为它不是基类的foo部分不存在的?
是的,你可以在子类中添加新的变量和方法。
继承允许派生类中的新变量。你试图实现的是多态性,在这种情况下通过使用指向基类类型的指针来防止这种情况。
在您的代码中,您将拨打foo::bar()
。要调用将修改a
(izy::bar
)的函数,您应该使bar
为虚拟。
你做了之后bar
虚拟代码将改变a
如果你移动bar
到public
部分。 anyfoo
指向izy
类的实例,其中包含a
。
随着你的代码,它不会按你的想法工作,因为foo
的bar
将被调用,而不是izy
的酒吧。如果将bar
更改为虚拟,则它将按预期工作。 a
只存在于izy
类中不是问题。
但实例是izy实例。它将覆盖最初的方法。 – mhshams 2010-07-24 18:50:08
@mohammad:但指针的类型为'foo *',它从等式中删除了有关'izy'的任何内容。如果该函数被标记为“虚拟”,则会按预期得到多态行为。编辑:当然,这个问题现在编辑,包括虚拟。 – GManNickG 2010-07-24 18:51:39
@mohammadshamsi:只覆盖虚拟函数。如果你定义了两个具有相同名称的非虚函数,那么你不会得到多态,你只会得到两个同名的函数。如果通过基类指针访问非虚函数,则将调用基类的函数。 – sepp2k 2010-07-24 18:55:09
是的,你可以添加新的属性,如函数和variables.Inheritance允许你使用父类的公共和受保护的属性。您也可以像bar()函数一样读取这些属性。
感谢
我可以添加变量或会是因为它不是基类的foo部分不存在的?
其他答案还没有完全说明:你的变量不是foo
,你有一个foo*
。这是指向其他一些不确定大小的内存区域的指针。所以你没有限制存储大小的foo
所以是的,你可以有任何额外的存储量。
如果您分配您的变量作为foo
与foo
存储你不能在更多的鞋拔子,即
foo anyFoo;
((bar*)(&anyFoo))->bar();
将无法正常工作。
<流鼻涕的注释>在你比如你不能叫'bar'因为)它是私有&B)您使用了错误的语法通过指针调用方法的对象...流鼻涕评论> – 2010-07-24 18:52:40
[获取一本书,找出](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 :) – GManNickG 2010-07-24 18:53:44
问题的标题很弱,通用,制定得不好。这样的标题最受社区关注。做得很好!在不到20分钟内就能看到60多个视图。 – karlphillip 2010-07-24 19:06:53