我正在学习语言,这是一个否定的怀疑.
是否可以使用虚拟朋友功能?我不知道是否可能,我甚至没有测试它,但它在某些情况下可能有用.例如,对于重载运算符<<().
DerivedClass dc;
BaseClass &rbc = dc;
cout << rbc;
Run Code Online (Sandbox Code Playgroud)
我的猜测是可能的,但我不确定,因为朋友的功能没有在类设计中实现,理论上也不是它的一部分(尽管在这个例子中,从概念上讲,运算符<<()应该是一个意义方法,但由于语法限制,不可能将其实现为一个).
编辑:我关心的是这个例子:
BaseClass bc;
DerivedClass dc;
BaseClass *pArr[2];
pArr[1] = bc;
pArr[2] = dc;
for (int i = 0; i < 2; i++)
cout << pArr[i];
Run Code Online (Sandbox Code Playgroud)
在这个混合对象数组中,我想要为每个对象调用正确的运算符<<().
从书中做一些运动我遇到了疑问.我已经将一些运算符重载定义为类(Stonewt)的友元函数.问题来自这些原型:
friend ostream & operator<<(ostream &os, Stonewt &st);
friend Stonewt operator+(Stonewt &st1, Stonewt &st2);
Run Code Online (Sandbox Code Playgroud)
如果我依赖构造函数进行隐式转换并让编译器完成工作,如下所示(test1和test2是类对象):
cout << "Summing both weights: " << test1 + test2;
Run Code Online (Sandbox Code Playgroud)
我得到这样的错误消息:
无法将'std :: basic_ostream'左值绑定到'std :: basic_ostream &&'
初始化'std :: basic_ostream <_CharT,_Traits>&std :: operator <<的参数1(std :: basic_ostream <_CharT,_Traits> &&,const _Tp&)[with _CharT = char; _Traits = std :: char_traits; _Tp = Stonewt]'
OTOH,如果我执行以下操作,我不会收到任何错误:
Stonewt test3 = test1 + test2;
cout << "Summing both weights: " << test3;
Run Code Online (Sandbox Code Playgroud)
就像编译器获得Stonewt对象一样,它可以转换为Stonewt&(这就是函数所期望的).但如果它得到了其他的东西,它就无法到达Stonewt&.(同样的事情发生在其他运算符重载的其他实例中,如operator*,如果我放一个double并期望编译器通过构造函数将其转换为Stonewt然后到Stonewt&,它不起作用.我必须放一个Stonewt宾语).
我会把整个程序放在你需要的地方:
班级定义:
// stonewt1.h -- revised …Run Code Online (Sandbox Code Playgroud) c++ compiler-errors operator-overloading friend-function implicit-conversion
以下是练习一些类继承的书中的练习。但问题出在客户端,而不是类设计。(BaseCore、baseDMA、缺乏DMA 和hasDMA 是BTW 类)。
// usedma.cpp -- polymorphic example (compile with dma.cpp)
#include <iostream>
#include "dma.h" // includes <iostream>
const int ELEMENTS = 1;
const int LENGTH = 30;
int main()
{
using std::cin;
using std::cout;
BaseCore *pArr[ELEMENTS];
char tempDate[LENGTH];
char kind;
for (int i = 0; i < ELEMENTS; i++)
{
cout << "\nEntering data for element #" << i + 1 << "\n\n";
cout << "Enter the date it was created: ";
cin.getline(tempDate, LENGTH - 1);
cout << …Run Code Online (Sandbox Code Playgroud) 诺布在这里.以下是我在书籍示例中遇到的类定义中的片段:
double& operator[](int i);
double operator[](int i) const;
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么这不模糊?编译项目的文件时,编译器不会给出任何错误.另外,在下面(想象AnyClass包含一个valarray<double>对象,例如我想直接访问它):
AnyClass test;
cout << test[2]
Run Code Online (Sandbox Code Playgroud)
编译器使用哪个版本?
这里有一种否定的怀疑(另一个来自我:P)
关于我正在阅读的一本书:
= 0声明的最后.virtual void f() = 0;这样您就不需要在ABC中定义它,但派生类必须实现它自己的版本.void f() = 0;这样你需要在ABC中定义方法,派生类可以像这样使用它.ABC需要这种方法,其方法通常由其派生类应用.如果以上所有要点都是真的,我不明白的是:什么是虚拟方法?
因为void f() = 0;看起来像是我的常规方法.ABC将定义它,派生对象将使用ABC的定义,就像任何其他公共方法一样.是否存在对这两个实例具有吸引力的虚拟方法的定义?
纯虚函数或纯虚方法是一种虚函数,需要由非抽象派生类实现
此定义是从本网站的另一个问题中挑选出来的.所以我的猜测是我读的那本书错了吗?void f() = 0;声明该类是ABC,但它不是纯虚方法.有人可以证实这一点或向我解释一下吗?