是否有任何内置函数或头文件,我需要添加单一继承?



这个单一继承代码没有错误,但是当我运行这个void函数void B::get_ab()按预期首先执行,但是函数(cin>>a>>b;)中的第二行首先执行,然后是第一行,有人知道这里发生了什么吗?

#include<iostream>
#include<stdio.h>
using std::equal_range;
using std::lower_bound;
using std::upper_bound;
using std::pair;
using std::string;
using std::getline;
using std::vector;
using std::cout;
using std::ios;
using std::set;
using std::cin;
class B
{
int a;
public: int b;
void get_ab();
int get_a(void);
void show_a(void);
};
class D:private B{
int c;
public: void mult();
void display();
};
void B::get_ab()
{

cout<<"Enter values of a&b";
cin>>a>>b;
}
int B::get_a()
{
return a;
}
void B::show_a()
{
cout<<"a="<<a<<"n";
}
void D::mult()
{
get_ab();
c=b*get_a();
}
void D::display()
{
show_a();
cout<<"b="<<b<<"n"<<"c="<<c<<"n";
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
D d;
d.mult();
d.display();
return 0;
}```

这样做的原因是您将cincin.tie(0);中的cout中解开。在程序提示用户输入之前,不能期望输出被刷新。

如果出于某种原因需要保留此配置(即:未绑定的流)并且仍然需要打印提示符,则需要显式刷新输出(例如:通过使用std::flushstd::endlI/O操纵符)。

你可能想检查这个线程:强制std::cout冲洗打印到屏幕。

和这个:为什么我们需要把std::cinstd::cout绑在一起

执行顺序不是问题。这是关于输出缓冲和刷新。
应该显式刷新提示输出。
您可能不希望在那里使用换行符。可以使用不带换行符的显式刷新,即
https://en.cppreference.com/w/cpp/io/manip/flush

我认为问题可能出在这两行代码上:

ios::sync_with_stdio(0);
cin.tie(0);

第二行允许stdin和out半独立地操作,不确保一个调用的缓冲区在另一个调用发生之前已经清空。我不认为继承与此有任何关系。试着把它们注释掉,看看会发生什么。

你为什么要用它们?这里有一个很好的关于他们做什么的讨论:

ios_base::sync_with_stdio(false);

cin.tie(空);

相关内容