当多态遇上数组 ... [C++, C++/CLI, C#]
When Polymorphism Meets Arrays ... [C++, C++/CLI, C#]
Written by Allen Lee
犹如星空与海鸥,漫画里根本你我一生永不会聚头,但我誓要共你牵手。
—— 古巨基,《美雪,美雪》
1. 能力测试
请回答下面的问题:
实现多态的效果,我们需要具备哪些条件?
上面的题目仅用于测试你是否具备阅读本文的必要条件。如果你对此题毫无头绪,那么我建议你尽快交叉本文。当然,要顺畅阅读本文,你还需要具备一些C++、C++/CLI和C#的基础知识。我想不必特别声明,建议当然是主观的。不过我愿意再说一次:建议是主观的,你有选择。
2. ... In C++,
好吧,既然你走到这一步,我建议你坚持下去。当然,你还是随时可以交叉本文,总之,你有选择。来,请先看看如下代码:
// Code #01
#include
#include
class A
{
public:
virtual void Print()
{
std::cout << "A" << std::endl;
}
} ;
class B : public A
{
public:
virtual void Print() override
{
std::cout << "B" << std::endl;
}
} ;
class C : public A
{
public:
virtual void Print() override
{
std::cout << "C" << std::endl;
}
} ;
void Print(A arr[], int count)
{
for (int i = 0; i < count; ++i)
{
arr[i].Print();
}
}
int _tmain( int argc, _TCHAR* argv[])
{
const int COUNT = 11;
A a_arr[COUNT];
Print(a_arr, COUNT);
B b_arr[COUNT];
Print(b_arr, COUNT);
C c_arr[COUNT];
Print(c_arr, COUNT);
return 0;
}
#include
#include
class A
{
public:
virtual void Print()
{
std::cout << "A" << std::endl;
}
} ;
class B : public A
{
public:
virtual void Print() override
{
std::cout << "B" << std::endl;
}
} ;
class C : public A
{
public:
virtual void Print() override
{
std::cout << "C" << std::endl;
}
} ;
void Print(A arr[], int count)
{
for (int i = 0; i < count; ++i)
{
arr[i].Print();
}
}
int _tmain( int argc, _TCHAR* argv[])
{
const int COUNT = 11;
A a_arr[COUNT];
Print(a_arr, COUNT);
B b_arr[COUNT];
Print(b_arr, COUNT);
C c_arr[COUNT];
Print(c_arr, COUNT);
return 0;
}
- A:请告诉我,Code #01有没有问题?
- B:Easy job!把它编译并运行一下就知道了呗!
接着,阿B编译了这段代码,程序运行后,阿B发现输出结果正是我们所期望的。于是,阿B得出结论:这段代码没问题!
然而,你是否知道这段代码其实隐藏着一个计时炸弹,只要时机一到,它就会引爆并使你的程序完全瘫痪?不信?那我只好让你见识一下这个炸弹引爆是的情景了。现在,我分别为class B和class C加入一个field,并修改一下main()以便给class B和class C里的field赋值(注意,本赋值操作不是必须的!):