选择
C
barfoob_bar
new B 会先创建一个B类对象,B类对象的构造需要调用B的构造函数,从而调用A的构造函数。A的构造函数中调用了 bar()函数,该函数虽然重写了,但这里不构成多态调用。因为虚表中的函数指针是在构造函数的初始化列表初始化的,虚表还没初始化就构不成多态。
所以先打印了bar
再调用foo(),该函数不是虚函数,根据指针类型进行调用
打印了foo()
再调用bar(),此时虚表已经构建完成,进行多态调用。
打印b_bar
D
B->1
首先,p是一个B类的指针。void test()是无参的,只有一个默认的类型位为A*的this指针,然后通过this指针去调用func()函数,this指针就是父类的指针,用父类的引用或者指针调用虚函数,符合多态调用。
多态调用的执行的一定是b->val,但继承是接口继承,即只有函数的重写是我子类的,初始化值依然是从父类那里继承下来的,即val依然是1。
121414
首先 foo()不构成多态 打印1 func()构成多态 打印2
再让A*类型的指针p去指向B空间
foo()不构成多态打印1 func()构成多态打印4
赋值兼容规则会自动切片,把B类的地址赋给A类指针本来就不需要强制类型转换。
跟上述一样打印1和4
B
给的是子类对象,子类对象肯定调用子类的函数。
基类中函数是虚函数,派生类中不加virtual也是虚函数
友元函数不能是虚函数(因为没有this指针),但是虚函数可以是(其他类的)友元函数。
虚函数也不能是静态成员函数(没有this指针)
B
写成A那样好像也不会报错,可能跟编译器有关系
基类没有重写,所以一定调用的是A的f()函数。
但此处没有将析构函数写成虚函数,delete不能释放子类空间 ,存在内存泄漏问题。(
运行时错误?)
new C创建一个C类对象,调用C的构造函数,C的构造函数又会去调用B的构造函数,B在调用A的,所以 A B C
但是析构函数并未重写,因为a是A类的指针,仅调用了A的构造函数。
这里理应程序运行崩溃。
编程
手套
手套__牛客网
// write code here
//要想从left里至少每个颜色都拿到 需要对left求和然后减去 颜色最少的手套数量 +1
//right同理 那要想从left和right里面找到一双手套,就需要left和right里面的最小值+1
//但是如果同颜色的手套在 left有 right没有 那这些值必须也被计算
//考虑最坏情况就是把这些 根本凑不成对的手套全部拿完 所以将left[i]*right[i]==0的情况单独考虑
class Gloves {
public:
int findMinimum(int n, vector<int> left, vector<int> right)
{
int left_min=INT_MAX,right_min=INT_MAX;
int left_sum=0,right_sum=0;
int need=0;
for(int i=0;i<n;i++)
{
if(left[i]*right[i]==0)
{
need+=left[i]+right[i];
}
else
{
left_sum+=left[i];
left_min=left_min>left[i]?left[i]:left_min;
right_sum+=right[i];
right_min=right_min>right[i]?right[i]:right_min;
}
}
return need+min(left_sum-left_min+1,right_sum-right_min+1)+1;
}
};
查找输入整数二进制中1的个数
注意如果能输入负数的话,用 n&(1<<i)
只能输入正整数 (n>>i)&1 和 n&(1<<i) 都可以