小编ZER*_*ERO的帖子

创建涉及虚拟继承的类的过程

在许多描述虚拟基类(通常用于解决钻石问题)的教程中,它们通常都有类似于此结构设计的代码:

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)

c++ inheritance diamond-problem

6
推荐指数
1
解决办法
320
查看次数

C++中的'static'关键字

我意识到它在超出范围后保留了价值(但变得无法访问),但我有几个问题.

  1. 当人们说它在范围之外无法访问时,它只是意味着你不能在其识别范围之外改变价值(它会出错)吗?

  2. 我在考虑这段代码:

    #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是一个声明而忽略了它的"变化"?

c++ static

5
推荐指数
1
解决办法
690
查看次数

istream和cin.get()

我对这两段代码之间的区别有疑问:

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个字符,循环将所有字符打印到输出.然而,与第一段代码不同,即使在两次输入之后它也不会停止,因为我可以继续输入.

为什么我可以在第二段代码中连续输入字符序列而不是第一段呢?

c++ cin istream

1
推荐指数
1
解决办法
3492
查看次数

标签 统计

c++ ×3

cin ×1

diamond-problem ×1

inheritance ×1

istream ×1

static ×1