在许多描述虚拟基类(通常用于解决钻石问题)的教程中,它们通常都有类似于此结构设计的代码:
class Animal
{
public:
Animal()
{
cout << "Creating Animal\n";
}
};
///////////////////////////
class FourLegs : virtual public Animal
{
public:
FourLegs()
{
cout << "Creating FourLegs\n";
}
};
///////////////////////////
class Mammal : virtual public Animal
{
public:
Mammal()
{
cout << "Creating Mammal\n";
}
};
///////////////////////////
class Fox : public FourLegs, public Mammal
{
public:
Fox()
{
cout << "Creating Fox\n";
}
};
Run Code Online (Sandbox Code Playgroud)
当我创建Fox的实例时,我得到了预期的输出,只创建了一个Animal:
Creating Animal
Creating FourLegs
Creating Mammal
Creating Fox
Run Code Online (Sandbox Code Playgroud)
如您所见,我有两个二级类继承虚拟.现在,如果只有一个二级类被虚拟继承,而另一个只是公开继承,那么就会出现有趣的输出.例如,如果FourLegs是继承的公共和Mammal继承虚拟公共,这是输出:
Creating Animal
Creating …Run Code Online (Sandbox Code Playgroud) 我意识到它在超出范围后保留了价值(但变得无法访问),但我有几个问题.
当人们说它在范围之外无法访问时,它只是意味着你不能在其识别范围之外改变价值(它会出错)吗?
我在考虑这段代码:
#include "iostream"
void staticExample();
int main()
{
staticExample();
return 0;
}
void staticExample()
{
for (int i = 1; i <= 10; ++i)
{
static int number = 1;
std::cout << number << "\n";
++number;
}
}
Run Code Online (Sandbox Code Playgroud)我想,在循环的每次迭代中,我将'number'变量设置为1.正如我第一次预期的那样,它打印了1,2,3 .. 10.编译器是否识别出行设置它是1是一个声明而忽略了它的"变化"?
我对这两段代码之间的区别有疑问:
char buffer5[5];
cin.get(buffer5, 5);
cout << buffer5;
cin.get(buffer5, 5);
cout << buffer5;
Run Code Online (Sandbox Code Playgroud)
和
char buffer4;
while (cin.get(buffer4))
{
cout << buffer4;
}
Run Code Online (Sandbox Code Playgroud)
在第一段代码中,代码获得5个字符并将其放入buffer5中.但是,由于您按Enter键,因此在调用get()时不会将换行符放入流中,因此程序将终止并且不会要求您再换一轮5个字符.
在第二段代码中,cin.get()等待输入流的输入,因此循环不会终止(我认为).假设我在输入流中输入"Apple".这将在输入流中放入5个字符,循环将所有字符打印到输出.然而,与第一段代码不同,即使在两次输入之后它也不会停止,因为我可以继续输入.
为什么我可以在第二段代码中连续输入字符序列而不是第一段呢?